home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
AmigActive 23
/
AACD 23.iso
/
AACD
/
Resources
/
System
/
WhichAmiga
/
WhichAmiga.ASM
< prev
next >
Wrap
Assembly Source File
|
1999-05-02
|
111KB
|
5,366 lines
; FILE: Source:WhichAmiga.ASM REV: 772 --- Identify which Amiga model you're running
; Hist
; 0-17 Prehistoric revisions. Working hard(?) 19.7.95.
; 18 Fixed a bug, it would have caused an enforcer hit under
; KS 1.3. ;-)
; 30 Added Workbench startup.
; 41 Machine evaluation works.
; 47 Added more machine formulas about 3.00 AM 20.7.95.
; 52 Added waterproof A3000 check (ramsey&gary test). Fixed machine
; formulas. Fixed CD³² KS version to V40.
; 57 Added FindConfigDev routine. Added A2500 and A500old.
; 71 Added all machine formulas.
; 74 Fixed MMU disable/enable as much as possible.
; 93 Aaargh! Movec with TC doesn't work! Use pmove.l (an) instead!!
; 96 GetCPU surrounded with DisableMMU/EnableMMU pair.
; 97-148 MUCH improved.
; 149 Added better console output code for running under V37 or better.
; CD³² users aren't forced to press return anymore... :- )
; 183 Added correct 68EC020 test.
; 197 Added real 68060 test and fixed MMU codes.
; 214 Fixed 68060 test and MMU codes.
; 228 Bug?: Sometimes can't disable MMU!?
; 275 Fixed MMU code a *lot*! Now display is blanked when display doesn't
; have 4x bandwidth. Now WhichAmiga works with Enforcer, CPU FASTROM and
; VMM etc.
; 281 Now checks cardslot via hardware.
; 282 Added test for stock model Walker.
; 301 Added display for Paula, Ramsey, Gary and Gayle. Now checks IDE
; connection via hardware.
; 302-304 Added DraCo support.
; 305 A4000 also has Ramsey chip, but no Gary chip! (I guess!)
; 309 Now should be 100% HW i ndependent, if needed (DraCo!)
; 313 Added display for Akiko.
; 328 Really fixed GetAddressBits and moved all VMEM critical code
; into CODE_C hunk.
; 331 Real support for DraCo... It wouldn't have worked...
; 333 Fixed CDTV test.
; 347 Tried to fix 68040/060 MMU code as much as possible.
; 364 A3000 and A4000 have both Ramsey and Gary, A4000 has Ramsey rev $F.
; 371 Few things added/fixed.
; 377 Fixed bad 040/060 MMU test.
; 384 Added very flexible CPU/FPU/MMU support.
; 427 Added support for boards.library and several gfx boards.
; 459 Rewritten MMU disable/enable code.
; 462 Added correct 68060 speed index.
; 466 Added special support for Blizzard boards' MAPROM.
; 471 Doesn't turn off write allocate... Turns on BERR timeout if Gary
; chip is present.
; 482 Added (hopefully) correct 68040/68060 MMU code.
; 486 Whops! Turned on BERR not DSACK! :-\
; 499 Added some extensive debug stuff...
; 514 Fixed bug in 68040/68060 MMU test code.
; 512 Finally works with 060 (and 040 too :). Fixed to test bit 15 of
; TC in MMU activity test on 040 and 060.
; 529 Fixed Ramsey&Gary test. Added other graphics systems.
; 535 Now adjusts comparisation CPU automagically.
; 538 Fixed A3000 machine formula to accept any ECS agnus.
; 543 Separated Ramsey and Gary test. Added correct KS 3.2 version
; information.
; 547 Fixed loads of OldOpenLibrary, lea (LibList,a6), (ThisTask,a6)...
; Cached SysBase etc.
; 560 Added SetPatch version info.
; 561 Fixed CloseLibrary(0) bug. Crashed on pre-36 kickstarts.
; 562 Added identification for UAE and phase5's PowerUP boards.
; 566 Added proper identification for PowerUP boards.
; 569 Added support for GigaMem (Max Virtmem).
; 578 Fixed "CNOP 0,4 in code" bug.
; 591 Fiddled a bit with 030 MMU code. Fixed UAE detection. Added
; 6 new gfxcards. Added display for sound cards. 7 sound cards
; detected as of now.
; 596 Added support for CyberGraphX V3.
; 608 Fiddled again with 030 MMU code. This time I found a bug from it :)
; Also tried to fix Ramsey & Gary code.
; 616 Fixed A3000/A4000 (=Ramsey&Gary) test (hopefully!)
; 619 Hopefully _finally_ fixed 030 MMU test for defective 68030 chips.
; Thanks to [Angel] for testing!
; 626 Fixed A4000T rom version.
; 631 Really fixed A4000 test. For some reason my AGA test required rev
; 13 Gayle chip to be present. Uh-oh.
; 632 Fixed A1000 ROM version because it can be changed.
; 633 Hopefully fixed UAE detection.
; 644 Defective 68030 MMU test (hopefully) fixed.
; 645 Added Delfina LITE sound card.
; 646 retina.library is bad... Added check for Retina boards. Thanks to
; Hurtman for the tip.
; 653 Added hardware clock detection. Suggested by Hurtman.
; 654 Removed one A500 board from A2000 expboardslist. Removed GVP kludge.
; 655 Removed two A500/A2000 boards from A500 list. Added one (hopefully)
; A2000 only board. Thanks to pyksy.
; 656 Finally got ppc.library autodocs&includes. Fixed PowerPC CPU version
; display.
; 744 13th May 1998: Made the source public in hope someone would continue
; the development. At least you can find some interesting routines from
; here. ;)
; 748 Fixed PPC detection, now support for multiple PPC cpus & fixed 604e
; not to show as '?'. Fixed some minor bugs.
; 753 Fixed pre-SetPatch 060 test.
; 755 Added brand new 0x0 MHz calculation. Should work well with all 0x0
; systems.
; 760 Fixed some bugs. Added PPL display to ppc processor display. Added
; revision display for 060. Added Blizzard PPC serial number display.
; 762 Added CyberVision PPC to gfxboard list.
; 772 2nd May 1999: Fixed ppc revision display + now displays busclock MHz
; instead of PPL number.
;
IFGT 0
Found this inside ppc.library : =)
PowerUP
Now you hold it in your hands which took a lot sweat,
internal Phase5 conflicts and the lack of motivation
devil made his appearance several times during the
2 years this project was ...running...
...a product which goals were changed several times
until it was released.
PowerUP/Phase5 project history censored and deleted.
ppc.library by Ralph Schmidt
SW/HW Debugging and food supply by Gerald Carda
Debugging,Suggestions and mental support by Frank Mariak
Debugging and some examples by Andre Osterhues
Private Greetings are going to:
Dirk Leschner, Arne Meier, Matthias Scheler and all my
Innernet-#grapevine friends
A3000:
CHIPS:
Denise - 8373 SuperDenise
Paula - Standard Paula
Agnus - 8372B Agnus for 2 meg CHIP RAM
Gary - Fat Gary
Amber - De-interlacing chip to provide 31KHz video
Buster - SuperBuster -07, -09 and -11
DMAC - SuperDMAC -02, -04
Ramsey - Ramsey -04 and -07
-===- Amiga 4000/040 -===-
Processor : Motorola 68040 / 25Mhz
Custom Chips : (6): Super Gary, Super Ramsey, Super Amber, Lisa, Alice,
Paula.
RAM : 6mb Ram [2mb Chip/ 4mb Fast]
ENDC
; TODO:
; o Add CGFX4 BlizzardVision PPC to gfxboard list
; o Fix FPU speed calculation and enable it
; o Add WarpOS support
; o Fix bugs...
; BUGS:
; o Crashes on GVP 1230!! (works sometimes) ;-(( *KLUDGEFIXED*
; o No support for:
; Amber / Super Amber ECS
; Buster Zorro III DMA Controller
; SuperIO "Walker project"
; Super Agnus (8375) 2MB chip PLCC A500+
; Portia A1000
; Daphne A1000
;
; Compiling options:
WA_USE_INCLUDES SET 1 ; 0=Use my custom system, 1=Use standard includes
WA_DEBUG SET 1 ; 0=No debug, 1=Enable debug mode
IFEQ WA_USE_INCLUDES
include "Devpac:Gen.gs"
ELSE
include "exec/memory.i"
include "exec/exec_lib.i"
include "dos/dos_lib.i"
include "libraries/graphics_lib.i"
IFND MYMACROS_I
call MACRO
jsr (_LVO\1,a6)
ENDM
ENDC
ENDC
include "exec/execbase.i"
include "libraries/expansion_lib.i"
include "libraries/configvars.i"
include "libraries/configregs.i"
include "dos/dosextens.i"
include "graphics/gfxbase.i"
IFEQ WA_USE_INCLUDES
include "hardware/demo.i"
ELSE
include "hardware/cia.i"
include "hardware/custom.i"
ENDC
include "hardware/intbits.i"
include "hardware/dmabits.i"
; include "libraries/boards.i"
; include "libraries/boards_lib.i"
include "powerup/ppclib/ppc.i"
_LVOPPCGetInfo EQU -$8A
IFND _LVOBestCModeIDTagList
_LVOBestCModeIDTagList EQU -$3C
ENDC
IFND CYBRBIDTG_MONITORID
CYBRBIDTG_MONITORID EQU $80050003
ENDC
IFND ciacra
ciapra EQU PRA
ciaprb EQU PRB
ciaddra EQU DDRA
ciaddrb EQU DDRB
ciatalo EQU TALO
ciatahi EQU TAHI
ciatblo EQU TBLO
ciatbhi EQU TBHI
ciatodlow EQU TODLO
ciatodmid EQU TODMID
ciatodhi EQU TODHI
ciasdr EQU SDR
ciaicr EQU ICR
ciacra EQU CRA
ciacrb EQU CRB
ENDC
IFND CIAB
CIAB EQU $BFD000
ENDC
IFND AFB_68060
AFB_68060 EQU 7
AFF_68060 EQU 1<<AFB_68060
ENDC
_LVOAddICRVector EQU -$6
_LVORemICRVector EQU -$C
_LVOAbleICR EQU -$12
_LVOSetICR EQU -$18
_LVOFreeNVData EQU -$24
_LVOGetNVInfo EQU -$36
INFINITE EQU $7FFFFFFF
MINUS_INFINITE EQU $80000000
ID_UNIX_DISK EQU ('U'<<24)!('N'<<16)!('I'<<8)!(1)
MC68000 EQU 0
MC68010 EQU 1
MC68EC020 EQU 2 24bit ab
MC68020 EQU 3 32bit ab
MC68EC030 EQU 4 no mmu
MC68030 EQU 5 mmu
MC68EC040 EQU 6 no mmu, no fpu
MC68LC040 EQU 7 mmu, no fpu
MC68040 EQU 8 mmu, fpu
MC68EC060 EQU 9 no mmu, no fpu
MC68LC060 EQU 10 mmu, no fpu
MC68060 EQU 11 mmu, fpu
;;MPC603e EQU 12 \
;;MPC604 EQU 13 } not yet implemented, but supported
;;MPC620 EQU 14 /
MIN020 EQU MC68EC020
MAX020 EQU MC68020
MIN030 EQU MC68EC030
MAX030 EQU MC68030
MIN040 EQU MC68EC040
MAX040 EQU MC68040
MIN060 EQU MC68EC060
MAX060 EQU MC68060
MAXCPU EQU INFINITE
NOMATH EQU 0
MC68881 EQU 1
MC68882 EQU 2
MC68040i EQU 3
MC68060i EQU 4
MINFPU EQU MC68881
MAXFPU EQU INFINITE
NOMMU EQU 0
MC68851 EQU 1
MC68030m EQU 2
MC68040m EQU 3
MC68060m EQU 4
MINMMU EQU MC68851
MAXMMU EQU INFINITE
DBG MACRO *id
IFNE WA_DEBUG
move.l #\1,-(sp)
jsr _dp
ENDC
ENDM
IFNE WA_DEBUG
_DBUGMAIN jmp __MAIN
_dp bra.b .exit
btst #INTB_INTEN-8,$DFF000+intenar
beq.b .exit
btst #INTB_PORTS,$DFF000+intenar+1
beq.b .exit
movem.l d0-a6,-(sp)
move.l (4).w,a6 No need...
clr.l -(sp)
move.l (8*4+7*4+4+4,sp),-(sp)
move.l sp,-(sp)
lea (LibList,a6),a0 No need...
lea (.dosname,pc),a1
call FindName
move.l d0,a6
lea (.fmt,pc),a0
move.l a0,d1
addq.l #1,-(a0)
move.l (a0),-(sp)
move.l sp,d2
call VPrintf
call Output
move.l d0,d1
call Flush
moveq #10,d1
call Delay
lea (4*4,sp),sp
movem.l (sp)+,d0-a6
.exit move.l (sp)+,(sp)
rts
CNOP 0,4
.cnt dc.l 0
.fmt dc.b 'DEBUG %ld: %4s',10,0
.dosname dc.b 'dos.library',0
SECTION DREALMAIN,CODE
ENDC
__MAIN
IFGT 0
lea (.init,pc),a0
lea (.rout,pc),a1
lea (.cleanup,pc),a2
jsr TimeRoutine
rts
.init move.l (4).w,a6
call Disable
rts
.rout move.l #$1000,d0
.loop subq.l #1,d0
bne.b .loop
rts
.cleanup move.l (4).w,a6
call Enable
rts
ENDC
; include "Source:WBStartUp.ASM"
; WBStartUp code
startupcode move.l (4).w,a6
move.l d0,d2
move.l a0,a2
sub.l a1,a1
jsr (-$126,a6) ;FindTask
move.l d0,a4
tst.l ($AC,a4) ; pr_CLI
bne.s .main
lea ($5C,a4),a0 ; pr_MsgPort
jsr (-$180,a6) ;WaitPort
lea ($5C,a4),a0 ; pr_MsgPort
jsr (-$174,a6) ;GetMsg
move.l d0,-(sp)
sub.l a0,a0
bsr.b .main
move.l d0,d2
move.l (4).w,a6
jsr (-$84,a6) ;Forbid
move.l (sp)+,a1
jsr (-$17A,a6) ;ReplyMsg
move.l d2,d0
rts
.main move.l d2,d0
move.l a2,a0
; a6=execbase
; a4=thistask (FindTask()'d! :)
MAINMAIN clr.b -1(a0,d0.l)
move.l a0,_Args
move.l a4,_ThisTask
lea (ExecBase00,pc),a0
move.l a6,(a0)
lea (__MAIN-4,pc),a0
.eloop move.l (a0),d0
beq.b .edone
lsl.l #2,d0
move.l d0,a0
move.l a6,(4,a0)
bra.b .eloop
.edone
tst.l (pr_CLI,a4)
seq WBMode
cmp.w #36,(LIB_VERSION,a6)
shi NewKick
IFNE WA_DEBUG
cmp.w #37,(LIB_VERSION,a6)
blo.b .db_exit
tst.b WBMode
bne.b .db_exit
move.l _Args,a0
tst.b (a0)
beq.b .db_exit
move.w #$4E71,_dp Enable debug stuff!
call CacheClearU
.db_exit
ENDC
lea (DosName,pc),a1
moveq #0,d0
call OpenLibrary
move.l d0,_DosBase
beq.b .fail
move.l d0,a5
exg a5,a6
call Output
tst.b WBMode
bpl.b .cli
lea (ConsoleName,pc),a0
tst.b NewKick
bpl.b .is_old
lea (NewConsoleName-ConsoleName,a0),a0
.is_old move.l a0,d1
move.l #MODE_READWRITE,d2
call Open
.cli move.l d0,OutputFH
exg a5,a6
bne.b .gotfh
.fail moveq #RETURN_FAIL,d0 <- Things are badly wrong!
rts
.gotfh
IFGT 0
Agnus PCMCIA Akiko AT-IDE NVRAM Ramsey&Gary
KS: Denise Chip A690ID Proc StockMHz UNI/01 A26x0
>A1000 1.1-1.3 O Older ¼/½ 01?? 7
>A500old 1.2-2.x,3.1 O Old ½ 01234 7
A500 1.2-2.x,3.1 O Fat ½-2 01234 7
A500+ 2.x,3.1 E Super 1-2 01234 7
>CDTV 1.3,2.x,3.1? O ?Fat? 1 (x) x 01234 7
>A600 2.05,3.1 E Fatter 1/2 x 0 3 x 7
>A1200* 3.0,3.1 A AGA 1/2 x 2346p x 14
>A1400 3.0,3.1 A AGA 1/2 x 2?? x 25/28
>CD³² 3.1 A AGA 2 x 23 x 14 x
A2000 1.2-2.x,3.1 O Fat ½/1 012346p 7
A2000+ 1.2-2.x,3.1 E Fat ½/1 012346p 7
>A2500 1.2-2.x,3.1 O Fat ½/1 23 25 x
>A3000 1.3/2.x,3.1 E Ftr/Sp 1/2 346p 16/25/30 x
>A3000UX UNIX E Ftr/Sp 1/2 346p 25 x x
>A4000 3.0,3.1 A AGA 2 346p x '30/25 x
A4000T* 3.1 A AGA 2 46p x '40/25 x
XWalker* 3.2 A AGA 1/2 3 p x 'EC30/40
>DraCo AmigaOS - - - 6? 50
* Amiga 3000 has always MMU and math co-processor. (?)
* Blizzard turbos can have Kickstart ROM ReKicked 100% transparently, so
any kickstart version goes!
* Amiga 3000 Tower has a HD floppy drive by default?
* Amiga 4000 Tower has 68040 @ 25 MHz or 68060 @ 50 MHz, AmigaOS 3.1 and
SCSI-II controller (built in, not A4091?)
X Walker has a SuperIO chip.
* Draco has Altais gfx card. (see rs:identify.library.rs)
Check PCMCIA: Find 'card.resource' 600/1200/(570?)
Check CDTV: Find 'cdtv.device'
Check A690ID: FindResident 'A690ID' 570 (A500 CD-ROM/CDTV expansion)
Check AT-IDE: Find interrupt 'AT-IDE' 600/1200/4000
Check Akiko: Test GfxBase.ChunkyToPlanarPtr CD³² [OR HW emul card]
Check NVRAM: Test Nonvolatile/GetNVInfo() maxstorage
Check UNIX: Find any bootable UNI/01 partition
Check A3000: Ramsey-Chip rev < $F (that is $D)
Check A4000: Ramsey-Chip rev >= $F
Check A2500: Match ConfigDev for A2620/A2630 turbo card
Check DraCo: Find 'draco.resource'
Check UAE: FindName(execbase.intrlist,'UAE filesystem')
ROM:
|| 256 KB
30: 1000old with KS1.0 \/
31: 1000 with KS 1.1 ntsc
32: 1000 with KS 1.1 pal
33 34: All but 1200, 4000, CD³², 500+, 600
35: Beta, not in chip ||
36: Early 3000 \/ 512 KB
37: All but 1000[old], 1200, 4000, CD³²
38: Not in chip
39: A1200, A1400, A4000
40: All but A1000[old]
41: Not in chip
42: Not in chip
X 43: Walker (AmigaOS 3.2) || 1024 KB
\/
- Agnus Hardware Stats -
MODEL VIDEO CHIPRAM CHIP TYPE
Agnus 8361 NTSC 512k A1000 Subsystem DIP
Agnus 8361 NTSC 512k A1000 Subsystem DIP
Fat Agnus 8370 NTSC 512k DIP
Fat Agnus 8370 NTSC 512k PLCC
Fat Agnus 8371 PAL 512k DIP
Fat Agnus 8371 PAL 512k PLCC
Fat Agnus 8372 NTSC/PAL 512k PLCC
Fatter Agnus 8372a NTSC/PAL 1024k PLCC
Super Agnus 8372b NTSC/PAL 2048k PLCC A3000
Super Agnus 8375 NTSC/PAL 2048k PLCC A500+
Alice NTSC/PAL 2048k PLCC A4000/A1200
Question: Why doesn't SCSI work on the A4000?
Answer: It does. But because of a bug in early versions of the Zorro-III
DMA controller (the "Buster" chip), DMA SCSI controllers didn't
work properly. This problem can be fixed (by replacing the early
revision 9 Buster with a revision 11 version) or avoided
altogether (by using a SCSI controller that doesn't use the
Zorro-III bus, like the one built into the Warp Engine
accelerator).
ENDC
movem.l a4/a5,-(sp)
bsr.b __Main
movem.l (sp)+,a4/a5
move.l d0,-(sp)
lea (CursorOn,pc),a0
bsr Printf
tst.b WBMode
bpl.b .cli_noclose
move.l a5,a6
tst.b NewKick
bmi.b .close_up
lea (PressReturn,pc),a0
bsr Printf
subq.l #4,sp
move.l OutputFH,d1
move.l sp,d2
moveq #1,d3
call Read
addq.l #4,sp
.close_up move.l OutputFH,d1
call Close
.cli_noclose
move.l (ExecBase00,pc),a6
move.l _DosBase,a1
call CloseLibrary
move.l (sp)+,d0
rts
_error moveq #RETURN_ERROR,d0
rts
__Main
DBG 'bgma'
move.l (4).w,a6 Use (4).w
bsr GetDraCo
DBG 'gdra'
bsr ExtAttnFlags
move.w d0,_AttnFlags
DBG 'gatf'
jsr CacheClearU Clear caches (now ExecBaseXX are valid)
DBG 'cacc'
lea (_GfxName,pc),a1
moveq #0,d0
call OpenLibrary
move.l d0,_GfxBase
beq _error
move.l d0,a1
call CloseLibrary
lea (ExpName,pc),a1
moveq #0,d0
call OpenLibrary
move.l d0,_ExpBase
beq _error
move.l d0,a1
call CloseLibrary
lea (sStart,pc),a0
bsr Printf
DBG 'seva'
st RamseyRev
move.w _AttnFlags,d0
bsr GetRamsey
; move.w #15,d0 debug
beq.b .no_ramsey
move.w d0,RamseyRev
cmp.w #15,d0
slo A3000ID
shs A4000ID
.no_ramsey
DBG 'gram'
st GaryRev
move.w _AttnFlags,d0
bsr GetGary
; move.w #0,d0 debug
; moveq #1,d1
beq.b .no_gary
move.w d0,GaryRev
call Disable
move.b $00DE0000,_wasDSACK
bpl.b .is_DSACK
bclr #7,$00DE0000 Set DSACK mode...
.is_DSACK call Enable
.no_gary
tst.b A3000ID A3000 must have both!
beq.b .no_a30gry
tst.w RamseyRev
bpl.b .no_a30gry
clr.b A3000ID
.no_a30gry
DBG 'ggry'
lea (sMMUna,pc),a0
move.l a0,MMU
lea (sNullStr,pc),a0
move.l a0,MMUStatus
btst #AFB_68030,_AttnFlags+1
beq.b .lowpros
st _EC
.lowpros jsr GetMMU
move.l d0,_MMUID
beq.b .nommu is 'EC' model
lea (sNotActiveStr,pc),a0
tst.l d1
beq.b .msetoff
lea (sRunningStr,pc),a0
.msetoff move.l a0,MMUStatus
lea (MMUTable,pc),a0
lea MMU,a1
subq.l #1,d0
bsr PutWStrPtr
clr.l EC
clr.l _EC
.nommu
DBG 'gmmu'
bsr GetGayle
move.w d0,GayleRev
cmp.w #13,d0
seq AGAGayleID
bsr GetPaula
move.w d0,PaulaRev
DBG 'ggay'
bsr GetGfxChip
move.b d0,GfxChipID+3
move.w d1,GfxChipRev
lea (GfxChipTable,pc),a0
lea GfxChip,a1
bsr PutWStrPtr
lea GChipRevBuffer,a2
move.l a2,GfxChipRev_ptr
lea (sRev,pc),a0
lea GfxChipRev,a1
move.w (a1),d0
bmi.b .is_OCS
bsr Sprintf
.is_OCS
DBG 'ggcp'
bsr GetAnimChip
move.b d0,AnimChipID+3
lea (AnimChipTable,pc),a0
lea AnimChip,a1
bsr PutWStrPtr
DBG 'gacp'
bsr GetGfxLibEmul
move.l d0,GfxLibEmul
move.w d1,BandWidth
lea (GfxLibEmulTable,pc),a0
lea GfxLibEmul_ptr,a1
bsr PutWStrPtr
lea DBWBuffer,a2
move.l a2,BandWidth_ptr
cmp.w #2,GfxLibEmul+2 AGA?
bne.b .not_aga
lea (sDBWFmt,pc),a0
lea BandWidth,a1
bsr Sprintf
.not_aga
DBG 'ggbe'
jsr GetCPU
DBG 'gcpu'
jsr GetProcInfo
DBG 'gpin'
move.l _100kHz,d0
divu.w #10,d0
swap d0
move.l d0,MHz
move.l CPUID,d0
lea (CPUTable,pc),a0
lea CPU,a1
bsr PutWStrPtr
bsr GetMisc
DBG 'gmsc'
tst.b CardSlotID
bne.b .has_slot
bsr GetCardSlot
move.b d0,CardSlotID
DBG 'gcsl'
.has_slot
; clr.l CardSlotID debug
lea (sNullStr,pc),a0
tst.l UAEID
beq.b .nouae
lea (sUAE,pc),a0
.nouae move.l a0,AfterMG_ptr
lea (sNA,pc),a0
tst.l HWClockID
beq.b .nohwclock
lea (sClockFound,pc),a0
.nohwclock move.l a0,HWClock_ptr
tst.b ATIDEID
bne.b .has_ATIDE
bsr GetATIDE
move.b d0,ATIDEID
DBG 'gide'
.has_ATIDE
lea (sFna,pc),a2
move.w _AttnFlags,d0
bsr GetFPU
move.b d0,FPUID+3
beq.b .nofpu
IFGT 0
move.l FPUCompareTime,-(sp) dbug
lsr.l #8,d0
lsr.l #8,d0
divu.w #10,d0
swap d0
move.l d0,-(sp)
lea (FPUTable,pc),a0
move.l FPUID,d0
add.l d0,d0
add.w (a0,d0.l),a0
move.l a0,-(sp)
lea (sFPUFmt,pc),a0
move.l sp,a1
lea FPUBuffer,a2
bsr Sprintf
;; addq.l #8,sp
lea (3*4,sp),sp dbug
.nofpu move.l a2,FPU_ptr
ELSE
lea (FPUTable,pc),a0
move.l FPUID,d0
add.l d0,d0
add.w (a0,d0.l),a0
move.l a0,-(sp)
lea (sFPUFmt,pc),a0
move.l sp,a1
lea FPUBuffer,a2
bsr Sprintf
addq.l #4,sp
.nofpu move.l a2,FPU_ptr
ENDC
DBG 'gfpu'
tst.l A4000ID
beq.b .not_a4000t
move.b A4091ID,A4000TID A4091 is checked in GetMisc subr
.not_a4000t
bsr GetGfxBoards
DBG 'ggbo'
bsr GetSndCards
DBG 'gsca'
bsr GetExpBoards
DBG 'gebo'
bsr GetChipMem
move.l d0,ChipMemd
move.l (ExecBase00,pc),a6
move.l (MaxLocMem,a6),d0
lsr.l #8,d0 /10
lsr.l #2,d0
move.l d0,ChipMem
DBG 'gcme'
bsr GetFastMem
move.l d0,FastMem
DBG 'gfme'
lea (sNullStr,pc),a0
move.l a0,VirtMem_ptr
bsr GetVirtMem
move.l d0,VirtMem
beq.b .novirtmem
lea sVirtMemBuf,a2
move.l a2,VirtMem_ptr
lea (sVirtMemFmt,pc),a0
lea VirtMem,a1
bsr Sprintf
.novirtmem
DBG 'gvme'
move.w _AttnFlags,d0
bsr GetChipRomVer
move.l d0,RomVer
move.l d1,RomChkSum
bsr GetKickStr
move.l d0,RomVerS
DBG 'gcro'
bsr GetCRomVer
move.l d0,CRomVer
move.l d1,CRomChkSum
bsr GetKickStr
move.l d0,CRomVerS
DBG 'grom'
lea (sNullStr,pc),a2
move.l RomVer,d0
cmp.l CRomVer,d0
bne.b .rekickrom
move.l RomChkSum,d0
cmp.l CRomChkSum,d0
beq.b .rom_is_same
.rekickrom lea sROMBuf,a2
lea (sReKickROM,pc),a0
lea CRomVer,a1
bsr Sprintf
.rom_is_same move.l a2,ReKickROM_ptr
bsr GetWBVersion
move.l d0,WBVer
bsr GetWBStr
move.l d0,WBVerS
DBG 'gwbv'
lea (sNoSetPatch,pc),a0
move.l a0,SetPatchVerPtr
bsr GetSetPatchVersion
tst.l d0
beq.b .nosetpatch
move.l d0,-(sp)
lea sSetPatchBuf,a2
lea (sSetPatchVerFmt,pc),a0
move.l sp,a1
bsr Sprintf
move.l a2,SetPatchVerPtr
addq.l #4,sp
.nosetpatch
DBG 'gspv'
lea ExpBoardsBuffer,a0
move.l a0,ExpBoards_ptr
bsr GetBoards
DBG 'gboa'
bsr GetOtherChips
DBG 'goth'
bsr EvaluateFormulas
move.l d0,MachineGuess
DBG 'deva'
lea (sRaport,pc),a0
lea Params,a1
bsr Printf
DBG 'prnt'
tst.w GaryRev
bmi.b .nogary
call Disable
tst.b _wasDSACK
bpl.b .was_DSACK
bset #7,$00DE0000 Set BERR if it was on originally!
.was_DSACK call Enable
.nogary
moveq #RETURN_OK,d0
rts
PutWStrPtr add.w d0,d0
add.w (a0,d0.w),a0
move.l a0,(a1)
rts
; IN: a0=buffer
GetBoards movem.l d0-a6,-(sp)
move.l a0,a4
move.l (ExecBase00,pc),a6
lea (.boardsname,pc),a1
moveq #2,d0
call OpenLibrary
move.l d0,d7
beq .exit
move.l d7,a6
moveq #0,d0
jsr (-36,a6) call AllocBoardInfo
move.l d0,d6
beq .closeboards
moveq #-1,d0 Any boards available?
bsr FindConfigDev
beq .noboards
lea (.expansion,pc),a0
.copy move.b (a0)+,(a4)+
bne.b .copy
subq.l #1,a4
sub.l a1,a1
.next move.l d6,a0
jsr (-42,a6) call NextBoardInfo
tst.l d0
beq.b .done
move.l d0,-(sp)
move.l (16,a0),-(sp) bi_ExSize
move.l (12,a0),-(sp) bi_ExAddress
move.l (32,a0),-(sp) bi_ProdName
move.l (28,a0),-(sp) bi_ManuName
move.l (24,a0),-(sp) bi_ProdID
move.l (20,a0),-(sp) bi_ManuID
move.l sp,a1
lea (.boardsfmt,pc),a0
move.l a4,a2
bsr Sprintf
lea (6*4,sp),sp
.findend tst.b (a4)+
bne.b .findend
subq.l #1,a4
move.l (sp),a0
cmp.w #$2140,(cd_Rom+er_Manufacturer,a0) Blizzard PPC?
bne.b .not_blizppc
cmp.b #110,(cd_Rom+er_Product,a0)
bne.b .not_blizppc
cmp.w #$00F0,(cd_BoardAddr,a0)
bne.b .not_blizppc
lea (.blizzppc,pc),a0
pea $F00010
move.l sp,a1
move.l a4,a2
bsr Sprintf
addq.l #4,sp
.blfindend tst.b (a4)+
bne.b .blfindend
subq.l #1,a4
.not_blizppc
move.l (sp)+,a1
bra.b .next
.done
.noboards
.freebi move.l d6,a0
jsr (-48,a6) call FreeBoardInfo
.closeboards move.l d7,a1
move.l (ExecBase00,pc),a6
call CloseLibrary
.exit movem.l (sp)+,d0-a6
rts
.boardsname dc.b 'boards.library',0 BOARDSNAME
.expansion dc.b ' Expansion board(s):',10,0
.boardsfmt dc.b '%s/%s: %s %s (@%s %s)',10,0
.blizzppc dc.b ' Blizzard PPC serial number: %7s',10,0
CNOP 0,4
GetExpBoards movem.l d0-d1/a0-a1,-(sp)
lea (ExpBoardTable1,pc),a0 If you have A2000 you propably
.loop1 move.l (a0)+,d0 have some expansion stuff in it!!
beq.b .done1
bsr FindConfigDev
sne A2000EID
bne.b .done1
bra.b .loop1
.done1
lea (ExpBoardTable2,pc),a0 If any A500 expansion is found
.loop2 move.l (a0)+,d0 A2000ID is cleared.
beq.b .done2
bsr FindConfigDev
beq.b .loop2
st A500EID
clr.b A2000EID
.done2
tst.l A690ID
beq.b .no_A500_CDROM
st A500EID
clr.b A2000EID
.no_A500_CDROM
movem.l (sp)+,d0-d1/a0-a1
rts
;;; ExpBoardTables
EXPBRD MACRO
dc.l ($\1<<16)!\2
ENDM
CNOP 0,4
ExpBoardTable2
EXPBRD 202,32 A560 Memory Module
EXPBRD 3F2,68 MicroBotics VXL RAM*32
EXPBRD 3F2,69 MicroBotics VXL 68030 turbo
EXPBRD 420,5 Supra 500 HD/RAM interface
EXPBRD 420,9 Supra 500XP
EXPBRD 420,12 Supra 500XP/Wordsync
EXPBRD 420,13 Supra 500XP/Wordsync
;500/2000!!! EXPBRD 7E1,10 GVP Series II (A500) memory board
;500/2000!!! EXPBRD 7E1,11 GVP Series II (A500) SCSI ctrl
EXPBRD 801,4 BSC Oktagon 500
EXPBRD 82C,4 BSC Oktagon 500
EXPBRD 2062,1 Expansion Systems DataFlyer 500 HD Ctrl
dc.l 0
CNOP 0,4
ExpBoardTable1
;Harlequin
EXPBRD 851,1 Resolver
EXPBRD 0851,2 Vivid 24
EXPBRD 07E1,68 Rembrandt
EXPBRD 0845,2 Visiona
;OpalVision
EXPBRD 838,0 FireCracker
EXPBRD 838,1 FireCracker
EXPBRD 406,0 Lowell A2410
EXPBRD 3EC,245 Kronos/C Ltd A2410
EXPBRD 0891,1 EGS
EXPBRD 07E1,32 IV24
;Video Toaster
EXPBRD 2140,34 CyberVision 64/4MB
EXPBRD 2140,50 CyberVision 64/3D
EXPBRD 2140,67 CyberVision 64/3D
EXPBRD 85E,1 GDA-1
EXPBRD 86A,1 Horizon
EXPBRD 86A,2 Blackbox
EXPBRD 86A,3 Voyager
EXPBRD 877,12 Picasso II
EXPBRD 877,13 Picasso II
EXPBRD 877,24 Picasso IV
EXPBRD 4754,16 RetinaZ3
EXPBRD 4754,19,sAltais
;RetinaZ2? Domino? Piccolo? PiccoloSD64? RainBowIII? 1600GX?
EXPBRD 201,1 A2088/A2288
EXPBRD 201,2 A2286
EXPBRD 201,103 A2386SX
EXPBRD 866,1 D. Salamon Golden Gate II BridgeCard
EXPBRD 2017,7 GoldenGate 80386
EXPBRD 2017,9 GoldenGate 80486
;EMC 486SLC
EXPBRD 200,2 3-State Megamix 2000
EXPBRD 202,1 A2090(A)
EXPBRD 202,4 A2090B
EXPBRD 202,9 A2060
EXPBRD 202,69 A2232 (prototype)
EXPBRD 202,70 A2232
EXPBRD 202,80 A2620 68020 turbo
EXPBRD 202,81 A2640 68030 turbo
EXPBRD 202,84 A4091 SCSI/SCSI-II ???
EXPBRD 202,112 A2065
EXPBRD 2F4,105 A2000 68040 turbo
EXPBRD 2F4,150 ??? 68040 turbo
EXPBRD 3EC,4 Kronos 2000 ???
EXPBRD 3ED,1 A-Squared LIVE!
EXPBRD 3F2,68 MicroBotics 68030 turbo???
EXPBRD 3F2,150 MB HardFrame/2000?
EXPBRD 3F2,158 MB HardFrame/2000?
EXPBRD 3FF,255 Dual serial port
EXPBRD 404,57 A2000 68030 turbo
EXPBRD 404,87 A2000 68030 turbo
EXPBRD 41D,1 Amerisar Ethernet
EXPBRD 420,1 Supra 4x4
EXPBRD 420,3 Supra 2000 DMA
EXPBRD 420,11 Supra 2400zi internal modem
EXPBRD 420,16 Supra 2400zi internal modem
EXPBRD 422,17 Mag40 68040 Turbo
EXPBRD 6E1,8 GVP Series I HD Ctrl
EXPBRD 7E1,3 GVP Hard Card 0
EXPBRD 7E1,8 GVP A3001 Expansion board
;; EXPBRD 7E1,9 GVP A3001 RAM 500/2000!!!
EXPBRD 7E1,255 GVP GForce 68040 Turbo
EXPBRD 7EA,105 68040 turbo???
;;wasina500? EXPBRD 801,6 BSC Oktagon 2008
;;wasina500? EXPBRD 801,8 BSC Oktagon 2008
EXPBRD 801,16 BSC Parallel/Serial
EXPBRD 801,32 BSC Frame Buffer
EXPBRD 801,64 BSC ISDN Master
EXPBRD 802,4 Kronos 2000 ???
EXPBRD 817,1 ICD 2000 SCSI
EXPBRD 817,4 ICD 2080 Board
EXPBRD 81D,9 GVP A2000-Ram8/2
EXPBRD 828,16 Applied LD2000 Modem???
EXPBRD 82C,5 BSC Memory Master Card
;;wasina500? EXPBRD 82C,6 BSC Oktagon 2008 ???
;;wasina500? EXPBRD 82C,8 BSC Oktagon 2008
EXPBRD 82C,18 ?
EXPBRD 82C,64 BSC ISDN Master
EXPBRD 87B,21 Emplant MAC emu
EXPBRD 1028,87 Imtromix hurricane 2800
EXPBRD 2017,7 ?
EXPBRD 2100,1 ReadySoft Amax II+ Mac emu
EXPBRD 2132,27 ?
EXPBRD 4754,4 Macrosystems Framegrabber?
EXPBRD A9AD,17 Reis-ware Scan King
EXPBRD 819,2 Kupke Golem SCSI II
dc.l 0
;;;
GetGfxBoards movem.l d0-d1/a0-a6,-(sp)
lea GfxBoardI,a4
lea (sNullStr,pc),a0
move.l a0,(a4)
lea GfxBoardBuffer+2,a3
move.l a3,(GfxBoard-GfxBoardI,a4)
subq.l #2,a3
move.l (4).w,a6
cmp.w #39,(LIB_VERSION,a6)
blo .nocgfx
lea (.cgfxname,pc),a1
moveq #41,d0
call OpenLibrary
tst.l d0
beq.b .nocgfx
move.l d0,a6
clr.l -(sp)
pea (12).w ; Cybervision PPC
pea CYBRBIDTG_MONITORID
move.l sp,a0
call BestCModeIDTagList
addq.l #1,d0
beq.b .no_b1
lea (.cvppc,pc),a0
bsr .copy1
.no_b1 move.w #14,(4+2,sp) ; Inferno
move.l sp,a0
call BestCModeIDTagList
addq.l #1,d0
beq.b .no_b2
lea (.inferno,pc),a0
bsr .copy1
.no_b2 lea (3*4,sp),sp
move.l a6,a1
move.l (4).w,a6
call CloseLibrary
.nocgfx
lea (GfxBoardTable,pc),a2
.loop movem.l (a2)+,d0/a0
tst.l d0
beq.b .done
bsr FindConfigDev
beq.b .loop
bsr.b .copy1
bra.b .loop
.done move.b #10,(a3)
movem.l (sp)+,d0-d1/a0-a6
rts
.copy1 lea (sGfxBoards,pc),a1
move.l a1,(a4) Set introducer
move.b #'/',(a3)+
move.b #' ',(a3)+
.copy move.b (a0)+,(a3)+
bne.b .copy
subq.l #1,a3
rts
.cgfxname dc.b 'cybergraphics.library',0
.cvppc dc.b 'CyberVision PPC',0
.inferno dc.b 'Inferno',0
CNOP 0,2
GetSndCards movem.l d0-d1/a0-a4,-(sp)
lea SndCardI,a4
lea (sNullStr,pc),a0
move.l a0,(a4)
lea SndCardBuffer+1,a3
move.l a3,(SndCard-SndCardI,a4)
lea (SndCardTable,pc),a2
lea (sSndCards,pc),a1
subq.l #1,a3
.loop movem.l (a2)+,d0/a0
tst.l d0
beq.b .done
bsr.b FindConfigDev
beq.b .loop
move.l a1,(a4) Set introducer
move.b #'/',(a3)+
.copy move.b (a0)+,(a3)+
bne.b .copy
subq.l #1,a3
bra.b .loop
.done move.b #10,(a3)
movem.l (sp)+,d0-d1/a0-a4
rts
; IN: d0=manu<<16+prod
; OUT: d0=ConfigDev if found, else zero, ccs set!
FindConfigDev movem.l d1-d2/a0-a1/a6,-(sp)
move.l _ExpBase,a6
sub.l a0,a0
moveq #0,d1
move.w d0,d1
clr.w d0
swap d0
moveq #-1,d2
cmp.w d2,d0
bne.b .ok1
move.l d2,d0
.ok1 cmp.w d2,d1
bne.b .ok2
move.l d2,d1
.ok2 call FindConfigDev
tst.l d0
movem.l (sp)+,d1-d2/a0-a1/a6
rts
GetOtherChips movem.l d0-a6,-(sp)
lea ChipsBuffer+2,a2
move.l a2,CustomChips
subq.l #2,a2
lea (sPaula,pc),a0
lea PaulaRev,a1
move.w (a1),d0
bmi.b .nopaula
bsr.b .print
.nopaula
lea (sRamsey,pc),a0
lea RamseyRev,a1
tst.w (a1)
bmi.b .noramsey
bsr.b .print
.noramsey
lea (sGary,pc),a0
lea GaryRev,a1
tst.w (a1)
bmi.b .nogary
bsr.b .print
.nogary
lea (sGayle,pc),a0
lea GayleRev,a1
move.w (a1),d0
bmi.b .nogayle
bsr.b .print
.nogayle
tst.l AkikoID
beq.b .noakiko
lea (sAkiko,pc),a0
bsr.b .print
.noakiko
movem.l (sp)+,d0-a6
rts
.print tst.b (a2)+
bne.b .print
move.b #',',(-1,a2)
move.b #' ',(a2)+
bra Sprintf
; IN: d0=AttnFlags ('030 info available)
; OUT: d0=ramseyrev, if z clear
GetRamsey movem.l d6-d7/a5-a6,-(sp)
moveq #0,d6
moveq #0,d7
tst.l NoHW
bne.b .no_chip2
btst #AFB_68020,d0
beq.b .no_chip2
lea (.supramsey,pc),a5
move.l (ExecBase00,pc),a6
call Disable
call Supervisor Ramsey revision:
cmp.w #$D,d6
blo.b .no_chip Minimum!
cmp.w #$F+5,d6 Maximum! ???
bhi.b .no_chip
moveq #-1,d7
.no_chip call Enable
.no_chip2 move.l d6,d0
tst.l d7 <- Does set ccs
movem.l (sp)+,d6-d7/a5-a6 <- Doesn't set ccs!!!
rts
.supramsey move.b $DE0043,d6
; move.b #$F,d6 debug
rte
; IN: d0=AttnFlags ('030 info available)
; OUT: d0=garyrev, if z clear
GetGary movem.l d1-d2/d6-d7/a0/a6,-(sp)
moveq #0,d6
moveq #0,d7
tst.l NoHW
bne.b .no_chip2
btst #AFB_68020,d0
beq.b .no_chip2
move.l (ExecBase00,pc),a6
call Disable
; Gary revision:
lea $DE1002,a0
clr.b (a0)
jsr CacheClearU
cmp.b #$7F,(a0)
nop
bne.b .no_chip
clr.b (a0)
nop
moveq #7,d0
.loop tst.b (a0)
nop
bpl.b .skip
bset d0,d6
.skip dbf d0,.loop
cmp.w #$FF,d6
beq.b .no_chip All bits 1 -> No chip!
cmp.w #209,d6 Test for Gaylething... :)
beq.b .no_chip (not really needed tho)
moveq #-1,d7
.no_chip call Enable
.no_chip2 move.l d6,d0
tst.l d7 <- Does set ccs
movem.l (sp)+,d1-d2/d6-d7/a0/a6 <- Doesn't set ccs!!!
rts
;NAME rev ADDR type chip Description
;---------------------------------------------------------------------------
;POTINP 016 R P Pot pin data read
;
; Bit
; Number Name Function
;
; 07-01 X Paula 8364 chip revision identification number
; (presently all zeroes)
; OUT: d0=paula revision or -1
GetPaula tst.l NoHW
bne.b .nohw
IFND potgor
move.w $DFF000+potinp,d0 potgor
ELSE
move.w $DFF000+potgor,d0
ENDC
and.w #%11111110,d0
lsr.w #1,d0
rts
.nohw moveq #-1,d0
rts
; OUT: d0=Gayle revision or -1
GetGayle movem.l d1-a6,-(sp)
tst.l NoHW
bne .no_gayle
move.l (ExecBase00,pc),a6
lea $DFF000,a0
lea $DE1000,a1 Gayle port
moveq #0,d1
call Disable
move.w (intenar,a0),d0
move.w #$BFFF,(intena,a1)
move.w #$3FFF,d2
cmp.w (intenar,a0),d2
bne.b .skip1
move.w d2,(intena,a1)
tst.w (intenar,a0)
bne.b .skip1
moveq #1,d1
.skip1 move.w d2,(intena,a0)
or.w #$8000,d0
move.w d0,(intena,a0)
call Enable
tst.w d1
bne.b .no_gayle
moveq #3,d2 Get revision:
move.b d1,(a1)
.loop move.b (a1),d0
lsl.b #1,d0
addx.b d1,d1
dbra d2,.loop
moveq #0,d0
move.b d1,d0
.exit tst.b d0
bne.b .exit2
.no_gayle moveq #-1,d0
.exit2 movem.l (sp)+,d1-a6
rts
; IN: d0=version<<16+revision
; OUT: d0=ptr to null terminated kick version string (eg. '2.05',0)
GetKickStr move.l d1,-(sp)
move.w d0,d1
swap d0
tst.w d0
beq.b .no_rom
sub.w #30,d0
cmp.w #13,d0
bls.b .ok
moveq #14,d0
.ok add.w d0,d0
lea (_ks,pc),a0
add.w (a0,d0.w),a0
cmp.w #(37-30)*2,d0
bne.b .skip
cmp.w #175,d1 >37.175<
bls.b .skip
addq.l #(_sKS_05-_sKS7),a0
.skip move.l a0,d0
move.l (sp)+,d1
rts
.no_rom lea (_sKNoROM,pc),a0
bra.b .skip
_wb dc.w _sKS0-_wb,_sKS1-_wb,_sKS2-_wb,_sKS3-_wb,_sKS4-_wb
dc.w _sKS5-_wb,_sKS6-_wb,_sKS7_2-_wb,_sKSWB-_wb,_sKS8-_wb
dc.w _sKS9-_wb,_sKSA-_wb,_sKSX-_wb
_ks dc.w _sKS0-_ks,_sKS1-_ks,_sKS2-_ks,_sKS3-_ks,_sKS4-_ks
dc.w _sKS5-_ks,_sKS6-_ks,_sKS7-_ks,_sKSH-_ks,_sKS8-_ks
dc.w _sKS9-_ks,_sKSH-_ks,_sKSH-_ks,_sKSA-_ks,_sKSX-_ks
_sKS0 dc.b '1.0',0
_sKS1 dc.b '1.1 ntsc',0
_sKS2 dc.b '1.1 pal',0
_sKS3 dc.b '1.2',0
_sKS4 dc.b '1.3',0
_sKS5 dc.b '1.4 beta',0
_sKS6 dc.b '2.0 beta',0
_sKS8 dc.b '3.0',0
_sKS9 dc.b '3.1',0
_sKSA dc.b '3.2',0
_sKSX dc.b 'unknown',0
_sKS7 dc.b '2.04',0
_sKS_05 dc.b '2.05',0
_sKSH dc.b 'hack',0
_sKS7_2 dc.b '2.0',0
_sKSWB dc.b '2.1',0
_sKNoROM
sNoSetPatch dc.b 'version information not available',0
CNOP 0,4
; IN: d0=version<<16+revision
; OUT: d0=ptr to null terminated WB version string (eg. '2.1',0)
GetWBStr move.l d1,-(sp)
move.w d0,d1
swap d0
tst.w d0
beq.b .no_wb
sub.w #30,d0
cmp.w #11,d0
bls.b .ok
moveq #12,d0
.ok add.w d0,d0
lea (_wb,pc),a0
add.w (a0,d0.w),a0
.done move.l a0,d0
move.l (sp)+,d1
rts
.no_wb lea (_sKNoROM,pc),a0
bra.b .done
ExtAttnFlags movem.l d1/d2/a0-a1/a6,-(sp)
move.l (4).w,a6 Use (4).w
move.w (AttnFlags,a6),d2
tst.l NoHW
bne.b .nohw
cmp.w #37,(LIB_VERSION,a6)
bhs.b .test060
jsr Test030_040_882
or.w d0,d2
;; bra.b .xit
.test060 btst #AFB_68040,d2 You must have 68040 flag
beq.b .no060 set to have 68060.
tst.b d2 Test #AFB_68060
bmi.b .is060 Is already valid!
jsr Test060 Test for 68060.
.is060
.no060
.nohw
.xit move.w d2,d0
movem.l (sp)+,d1/d2/a0-a1/a6
rts
GetCardSlot moveq #0,d0
move.w GayleRev,d1
cmp.w #13,d1
bne.b .no_cardslot
moveq #-1,d0
.no_cardslot rts
GetATIDE movem.l d1-a6,-(sp)
lea $00DA2000,a4 IDE port
bsr.b .TestIDEHW
movem.l (sp)+,d1-a6
tst.l d0
rts
.TestIDEHW move.l d0,-(sp)
move.w GayleRev,d1
cmp.w #13,d1
bne.b .nohw
moveq #9,d0 Try 10 times:
move.b d0,(sp)
.try_again move.b (3,sp),($0018,a4)
move.b ($0010,a4),d1
move.b ($001C,a4),d0
move.l d0,a0
and.b #$C0,d0
beq.b .has2
cmp.b #$C0,d0
beq.b .nohw
tst.b d0
bpl.b .has
move.l a0,d0
eor.b d1,d0
and.b #$FD,d0
bne.b .nohw
moveq #2,d0
bra.b .exit
.has2 btst #4,(3,sp)
bne.b .nohw
subq.b #1,(sp)
bmi.b .nohw
bsr.b WaitVBL
bra.b .try_again
.valid moveq #1,d0
bra.b .exit
.has moveq #$12,d0
move.b d0,($0010,a4)
cmp.b ($0010,a4),d0
bne.b .nohw
moveq #$34,d0
move.b d0,($0010,a4)
cmp.b ($0010,a4),d0
beq.b .valid
.nohw moveq #0,d0
.exit addq.w #4,sp
rts
WaitVBL moveq #1,d0
WaitBlanks movem.l d2/a2/a3/a6,-(sp)
move.l d0,d2
lea (-$0022,sp),sp
move.l sp,a2
move.b #4,(8,a2)
clr.b (9,a2)
clr.l (10,a2)
clr.b (14,a2)
move.b #4,(15,a2)
suba.l a1,a1
call FindTask
move.l d0,($0010,a2)
lea ($0014,a2),a0
move.l a0,(8,a0)
addq.l #4,a0
clr.l (a0)
move.l a0,-(a0)
lea (-$0028,sp),sp
move.l sp,a3
lea (TimerDevName,pc),a0
move.l a3,a1
moveq #UNIT_VBLANK,d0
moveq #0,d1
call OpenDevice
tst.l d0
bne.b .exit
move.l a2,(IO+MN_REPLYPORT,a3)
move.l a3,a1
move.w #TR_ADDREQUEST,(IO_COMMAND,a1)
clr.l (IOTV_TIME+EV_HI,a1)
move.l d2,(IOTV_TIME+EV_LO,a1)
call DoIO
move.l a3,a1
call CloseDevice
.exit lea ($004A,sp),sp
movem.l (sp)+,d2/a2/a3/a6
rts
GetDraCo movem.l d0-a6,-(sp)
move.l (4).w,a6 Use (4).w
lea (.DraCoName,pc),a1
call OpenResource
tst.l d0
;;DEBUG
beq.b .nodraco
st DraCoID
st NoHW
.nodraco movem.l (sp)+,d0-a6
rts
.DraCoName dc.b 'draco.resource',0
CNOP 0,4
GetUAE movem.l d0-a6,-(sp)
move.l (4).w,a6 Use (4).w
call Forbid
move.l (IVEXTER+IV_DATA,a6),d0
beq.b .nouae
move.l d0,a0 a0=lh
lea (.UAEName,pc),a1
call FindName
tst.l d0
beq.b .nouae
st UAEID
.nouae call Permit
movem.l (sp)+,d0-a6
rts
.UAEName dc.b 'UAE filesystem',0
CNOP 0,4
GetPowerUP movem.l d0-a6,-(sp)
lea sPowerUPBuf,a0
move.l a0,PowerUP_ptr
clr.b (a0)
move.l (4).w,a6 Use (4).w
cmp.w #36,(LIB_VERSION,a6)
blo .oldkick
moveq #3*4,d0
move.l #MEMF_PUBLIC!MEMF_CLEAR,d1
call AllocVec
tst.l d0
beq .nomem
move.l d0,a5
lea (.ppcName,pc),a1
moveq #44,d0
call OpenLibrary
tst.l d0
beq .noppc
move.l d0,a6
move.l #PPCINFOTAG_CPUCOUNT,(a5) Get CPU count
move.l a5,a0
call PPCGetInfo
move.l d0,d7
beq .nocpus
st PowerUPID
lea (sPowerUPFmt0,pc),a0
move.l d7,-(sp)
move.l sp,a1
lea sPowerUPBuf,a2
bsr Sprintf
addq.l #4,sp
.findend1 tst.b (a2)+
bne.b .findend1
subq.l #1,a2
moveq #0,d6
.cpu_loop
moveq #-1,d5
move.l #PPCINFOTAG_CPU,(a5) Version of the CPU
move.l d6,(4,a5)
move.l a5,a0
call PPCGetInfo
moveq #CPU_603,d1 3
moveq #CPU_604e,d2 9
cmp.l d1,d0
blo.b .unknown1
cmp.l d2,d0
bhi.b .unknown1
move.l d0,d5
.unknown1
moveq #10,d0
cmp.w #45,(LIB_VERSION,a6)
blo.b .noppldiv
move.l #PPCINFOTAG_CPUPLL,(a5) PLL Divider of the CPU
move.l d6,(4,a5)
move.l a5,a0
call PPCGetInfo
move.l d0,d1
and.l #$FFFFFFF0,d1
bne.b .noppldiv
moveq #10,d0
.noppldiv move.l d0,-(sp)
move.l #PPCINFOTAG_CPUREV,(a5) Get CPU revision
move.l d6,(4,a5)
move.l a5,a0
call PPCGetInfo
lsl.l #8,d0 ; ddccbbaa -> ccbbaa00
lsr.w #8,d0 ; ccbbaa00 -> ccbb00aa
move.l d0,-(sp)
move.l #PPCINFOTAG_CPUCLOCK,(a5) Clock of the CPU (Get CPU MHz)
move.l d6,(4,a5)
move.l a5,a0
call PPCGetInfo
move.l d0,-(sp)
pea (sPPCxx,pc)
move.l d5,d0
bmi.b .unknown2
lea (PowerPCTable,pc),a0
move.l sp,a1
bsr PutWStrPtr
move.l d5,d0
lea (PowerPCPLLTable,pc),a0
add.w d0,d0
lea (12,sp),a1
add.w (a0,d0.w),a0
move.l (4,sp),d0
move.l (a1),d1
mulu.w #10,d0
add.w d1,d1
divu.w 0(a0,d1.w),d0
move.l d0,(a1)
.unknown2
lea (sPowerUPFmt1,pc),a0
move.l sp,a1
;a2=buffer
bsr Sprintf
lea (4*4,sp),sp
.findend2 tst.b (a2)+
bne.b .findend2
subq.l #1,a2
addq.l #1,d6
subq.l #1,d7
bne .cpu_loop
move.b #10,(a2)+ LF
clr.b (a2)
.nocpus move.l a6,a1
move.l (4).w,a6 Use (4).w
call CloseLibrary
.noppc move.l a5,a1
call FreeVec
.nomem
.oldkick movem.l (sp)+,d0-a6
rts
.ppcName dc.b 'ppc.library',0
CNOP 0,4
GetMisc movem.l d0-d7/a0-a6,-(sp)
move.l (ExecBase00,pc),a6
lea (.CardName,pc),a1
call OpenResource
tst.l d0
sne CardSlotID
move.l (IVPORTS,a6),a0
lea (.ATIDEName,pc),a1
bsr .findnametest
sne ATIDEID
lea (DeviceList,a6),a0
lea (.CDTVDevName,pc),a1
bsr .findnametest
sne CDTVID
lea (.A690IDName,pc),a1
call FindResident
tst.l d0
beq.b .no_A690
st A690ID
clr.b CDTVID
.no_A690
lea (sNullStr,pc),a0
move.l a0,C2P
move.l _GfxBase,a0
cmp.w #40,(LIB_VERSION,a0)
blo.b .no40
tst.l (gb_ChunkyToPlanarPtr,a0)
beq.b .noC2P
lea (sHWC2P,pc),a0
move.l a0,C2P
st C2PID
lea (.NonvolName,pc),a1
moveq #40,d0
call OpenLibrary
tst.l d0
beq.b .nononvol
move.l d0,a6
moveq #1,d1 Kill requesters
call GetNVInfo
tst.l d0
beq.b .caseoffailure
move.l d0,a0
move.l (a0),d0 nvi_MaxStorage
beq.b .noNV
cmp.l #128*1024,d0 Estimated...
slo CD32NVRAMID It's not an emulator!
.noNV call FreeNVData
.caseoffailure move.l a6,a1
move.l (ExecBase00,pc),a6
call CloseLibrary
.nononvol
.noC2P
.no40
move.l _DosBase,a1 Find UNI/01 partitions:
move.l (dl_Root,a1),a2
moveq #DLT_VOLUME,d1
move.l (ExecBase00,pc),a6
call Forbid
move.l (rn_Info,a2),a0
add.l a0,a0
add.l a0,a0
move.l (di_DevInfo,a0),d0
.nextdev beq.b .devs_scanned
lsl.l #2,d0
move.l d0,a0
cmp.l (dl_Type,a0),d1 (d1=DLT_VOLUME)
bne.b .gnd
cmp.l #ID_UNIX_DISK,(dl_DiskType,a0)
seq UNIXID
beq.b .devs_scanned
.gnd move.l (a0),d0 dl_Next
bra.b .nextdev
.devs_scanned call Permit
move.l #$202<<16+80,d0 Try to find 'A2620 68020 Accelerator / RAM Board'
bsr FindConfigDev
sne A2500ID
bne.b .is2500
move.l #$202<<16+81,d0 Try to find 'A2630 68030 Accelerator / RAM Board'
bsr FindConfigDev
sne A2500ID
.is2500
move.l #$202<<16+84,d0 Try to find 'CBM A4091 SCSI/SCSI-II HD Controller'
bsr FindConfigDev
sne A4091ID
move.l #$2140<<16!$FFFF,d0 Try to find any 'Phase 5 Digital Products'
bsr FindConfigDev
sne Phase5ID
bsr GetPowerUP
DBG 'gpup'
bsr GetUAE
DBG 'guae'
bsr GetClock
move.l d0,HWClockID
DBG 'gclk'
movem.l (sp)+,d0-d7/a0-a6
rts
.findnametest call Disable
call FindName
call Enable
tst.l d0
rts
.CardName dc.b 'card.resource',0
.CDTVDevName dc.b 'cdtv.device',0
.A690IDName dc.b 'A690ID',0
.ATIDEName dc.b 'AT-IDE',0
.NonvolName dc.b 'nonvolatile.library',0
CNOP 0,4
; IN: -
; OUT: d0=zero if no clock, nonzero if clock found
GetClock movem.l d1-a6,-(sp)
moveq #0,d7
move.l (ExecBase00,pc),a6
call Forbid
lea (.battclockres,pc),a1
call OpenResource
tst.l d0
beq.b .nores
move.l d0,a6
jsr (-12,a6)
move.l (ExecBase00,pc),a6
tst.l d0
beq.b .exit
bra.b .found
.nores lea $DC0001,a0
moveq #0,d2
moveq #0,d1
.loop moveq #15,d2
and.b (a0),d2
cmp.b #9,d2
beq.b .loop
addq.b #1,d2
bsr.b .wait
moveq #$F,d1
and.b (a0),d1
sub.b d2,d1
beq.b .found
cmp.b #1,d1
bne.b .exit
.found moveq #1,d7
.exit call Permit
move.l d7,d0
movem.l (sp)+,d1-a6
rts
.wait bsr.b .wait2
move.l d0,d1
.wloop bsr.b .wait2
sub.l d1,d0
cmp.l #60,d0
bne.b .wloop
rts
.wait2 moveq #0,d0
move.b $BFEA01,d0
lsl.w #8,d0
move.b $BFE901,d0
lsl.l #8,d0
move.b $BFE801,d0
rts
.battclockres dc.b 'battclock.resource',0
CNOP 0,2
GetProcInfo movem.l d0-a6,-(sp)
lea (sNullStr,pc),a2
tst.b _AttnFlags+1
bpl.b .no060
lea (.getpcr,pc),a5
call Supervisor
lsr.w #8,d0
swap d0 d0.l=rev<<16!id
move.l d0,-(sp)
lea (sProcInfo060Fmt,pc),a0
move.l sp,a1
lea sPI060Buffer,a2
bsr Sprintf
move.l (sp)+,d0
cmp.w #%0000010000110000,d0 fix CPUID according to CPU internal info
bne.b .not68060
move.l #MC68060,CPUID
.not68060 cmp.w #%0000010000110001,d0
bne.b .not68xx060
move.l #MC68EC060,CPUID no FPU, no MMU -> EC060
tst.l _MMUID
beq.b .nommu
move.l #MC68LC060,CPUID no FPU, MMU -> LC060
.nommu
.not68xx060
.no060 move.l a2,procinfo_ptr
movem.l (sp)+,d0-a6
rts
.getpcr or.w #$700,sr
dc.w $4E7A,$0808 movec pcr,d0
nop
rte
GetCPU jsr GetAddressBits
move.l d0,AddrBits
DBG 'gabi'
move.w _AttnFlags,d0
bsr GetMinCPUnum
move.l d0,d7
cmp.b #MIN020,d7
bne.b .not_020
cmp.w #32,AddrBits+2
bne.b .is_EC020
st _EC
addq.l #MC68020-MC68EC020,d7
.is_EC020 bra.b .proc_ok
.not_020
cmp.b #MIN030,d7
bne.b .not_030
tst.l _MMUID
beq.b .is_EC030
addq.l #MC68030-MC68EC030,d7
.is_EC030 bra.b .proc_ok
.not_030
cmp.b #MIN040,d7
beq.b .test_040
cmp.b #MIN060,d7
bne.b .not_040
.test_040 btst #AFB_FPU40,_AttnFlags+1
bne.b .is_full
tst.l _MMUID
beq.b .proc_ok
addq.l #1,d7
bra.b .proc_ok
.is_full addq.l #2,d7
;; bra.b .proc_ok
.not_040
.proc_ok
move.l d7,CPUID
IFGT 0
move.l (4).w,a6
move.w _AttnFlags,d0
btst #AFB_68030,d0 If 68000, 68010 or 68020 use old one.
beq.b .getmhz_old
cmp.w #37,(LIB_VERSION,a6) If V37+ and 68030+ use new one.
blo.b .getmhz_old
bsr GetMHz
bra.b .getmhz_new
ENDC
.getmhz_old bsr GetMHz_old
.getmhz_new move.l d0,_100kHz
lea (s68000,pc),a0
moveq #7,d1
move.l CPUCompareTime,d0
divu.w #180356/4,d0 68000 @ 7 MHz
addq.w #4/2,d0 Add 0.5 for correct rounding!
lsr.w #2,d0 /4
cmp.w #16,d0
bls.b .cmpbaseok
lea (s68030,pc),a0
moveq #25,d1
move.l CPUCompareTime,d0
divu.w #1442744/32,d0 68030 @ 25 MHz
add.w #32/2,d0 Add 0.5 for correct rounding!
lsr.w #5,d0 /32
.cmpbaseok move.w d0,Multiplier
move.l a0,CmpCPU_ptr
move.w d1,CmpCPUMHz
rts
; IN: D0.w=attnflags
; OUT: D0.l=procnum
GetMinCPUnum move.l d1,-(sp)
move.l d0,d1
moveq #0,d0
btst #AFB_68010,d1
beq.b .exit
moveq #MC68010,d0
btst #AFB_68020,d1
beq.b .exit
moveq #MIN020,d0
btst #AFB_68030,d1
beq.b .exit
moveq #MIN030,d0
btst #AFB_68040,d1
beq.b .exit
moveq #MIN040,d0
tst.b d1 Test #AFB_68060
bpl.b .exit
moveq #MIN060,d0
.exit move.l (sp)+,d1
rts
; New MHz calculator
IFND _LVOSubTime
_LVOSubTime EQU -$30
ENDC
; OUT: D0=100kHz
GetMHz movem.l d1-d7/a0-a6,-(sp)
moveq #0,d7
move.l (4).w,a6
lea (.utilname,pc),a1
moveq #37,d0
call OpenLibrary
move.l d0,_gcUtilBase
beq.b .noutil
lea (DeviceList,a6),a0
lea (.timername,pc),a1
call Forbid
call FindName
call Permit
move.l d0,_gcTimerBase
beq.b .notimer
move.w _AttnFlags,d0
bsr .get
move.l d0,d7
.notimer move.l _gcUtilBase,a1
move.l (4).w,a6
call CloseLibrary
.noutil move.l d7,d0
movem.l (sp)+,d1-d7/a0-a6
rts
.gfxname dc.b 'graphics.library',0
.utilname dc.b 'utility.library',0
.timername dc.b 'timer.device',0
CNOP 0,2
; IN: D0.w=attnflags
; OUT: D0=100kHz<<16+procnum
.get movem.l d1-d3/d6-d7,-(sp)
move.l d0,d6
moveq #0,d7
bsr .DoTimer
move.l d0,WAIndex
tst.l d0
beq .gcerror
tst.l _gcETicker
beq .gcerror
move.l CPUID,d1
add.l d1,d1
add.l d1,d1
move.l .gcSpeedTable(pc,d1.l),d2
move.l _gcUtilBase,a6
move.l #100,d1
call UMult32
move.l _gcETicker,d1
call UDivMod32
move.l d0,d1
beq .gcerror
move.l d2,d0
call UDivMod32
move.l d0,d7
.gcerror
move.l d7,d0
movem.l (sp)+,d1-d3/d6-d7
rts
.gcSpeedTable
dc.l ($1016BF*100/70938)*5000+5000 000 7.09379 MHz
dc.l ($1016BF*100/70938)*5000+5000 010 7.09379 MHz
dc.l ($ADDBB*100/70938)*4000+4000 020 14.18758 MHz
dc.l ($ADDBB*100/70938)*4000+4000
dc.l ($ADDBB*100/70938)*4000+4000 030 40.00000 MHz
dc.l ($ADDBB*100/70938)*4000+4000
dc.l ($341BF*100/70938)*4000+4000 040 40.00000 MHz
dc.l ($341BF*100/70938)*4000+4000
dc.l ($341BF*100/70938)*4000+4000
dc.l ($116BF*100/70938)*5000+5000 060 50.00000 MHz
dc.l ($116BF*100/70938)*5000+5000
dc.l ($116BF*100/70938)*5000+5000
; IN: d6.w=attnflags
; OUT: D0.l=compare time
.DoTimer movem.l d1-d7/a0-a6,-(sp)
move.l (4).w,a6
move.l _ThisTask,a1
moveq #127,d0
call SetTaskPri
move.l d0,-(sp)
cmp.w #4,BandWidth
beq.b .is_aga4x
move.l _GfxBase,a6
move.l (gb_ActiView,a6),-(sp) save view
sub.l a1,a1
call LoadView
call WaitTOF
call WaitTOF
.is_aga4x
move.l _GfxBase,a6
call WaitBlit Wait possible blit to finish.
bsr .timing2
move.l d0,d7
cmp.w #4,BandWidth Restore view, if needed
beq.b .is_aga4x2
move.l _GfxBase,a6
move.l (sp)+,a1
call LoadView
call WaitTOF
call WaitTOF
.is_aga4x2
move.l (4).w,a6
move.l _ThisTask,a1
move.l (sp)+,d0
call SetTaskPri
move.l d7,d0
movem.l (sp)+,d1-d7/a0-a6
rts
; IN: d6.w=attnflags
.timing2 move.l (4).w,a6
moveq #MEMF_CHIP,d1 chipmem for 000 and 010
btst #AFB_68020,d6
beq.b .tgoalloc
move.l #MEMF_ANY!MEMF_PUBLIC,d1 any mem for 020
btst #AFB_68030,d6
beq.b .tgoalloc
move.l #MEMF_FAST!MEMF_PUBLIC,d1 fastmem for 030, 040 and 060
.tgoalloc
move.l #CODE020SIZE,d0
call AllocVec
tst.l d0
beq .nomem
move.l d0,a5
lea (.code020,pc),a0
move.l a5,a1
move.l #CODE020SIZE,d0
call CopyMemQuick
call Forbid
move.l #CACRF_EnableI,d0 Disable all but inst cache for test
move.l #~CACRF_WriteAllocate,d1
call CacheControl
move.l d0,-(sp) Save prev cache state
bsr turnon060caches
jsr (a5)
bsr restore060caches
move.l (4).w,a6 Restore cache state
move.l (sp)+,d0
move.l #~CACRF_WriteAllocate,d1
call CacheControl
call Permit
move.l a5,a1
call FreeVec
move.l _gcTimerBase,a6
move.l a3,a0
move.l a2,a1
call SubTime
move.l (EV_LO,a3),d0
rts
.nomem moveq #0,d0
rts
CNOP 0,8
.code020 tst.l NoHW ** NO PC REL!
bne.b .skiphw1
lea $DFF000,a4
move.w (intenar,a4),d0
move.w #$7FFF,(intena,a4)
swap d0
move.w (dmaconr,a4),d0
move.w #$000F,(dmacon,a4) Disable audio
move.w #$C008,(intena,a4) Enable INT2 & CIAA int
or.l #$80008000,d0
move.l d0,-(sp)
.skiphw1
move.l _gcTimerBase,a6 ** NO PC REL!
lea _gcStartE,a2 ** NO PC REL!
lea _gcEndE,a3 ** NO PC REL!
move.l #5000000,d4
move.l a2,a0
call ReadEClock
bra.b .loop020
CNOP 0,8
.loop020 subq.l #1,d4
bne.b .loop020
move.l a3,a0
call ReadEClock
add.w #50,d0
divu.w #100,d0
and.l #$0FFFF,d0
move.l d0,_gcETicker ** NO PC REL!
tst.l NoHW ** NO PC REL!
bne.b .skiphw2
move.l (sp)+,d0
move.w #$7FFF,(intena,a4)
move.w d0,(dmacon,a4)
swap d0
move.w d0,(intena,a4)
.skiphw2 rts
CODE020SIZE EQU (*-.code020+7)&-8
turnon060caches
tst.b _AttnFlags+1 Test #AFB_68060
bpl.b .exit
movem.l d0-d1/a5-a6,-(sp)
move.l (4).w,a6
lea (.turnon,pc),a5
call Supervisor
movem.l (sp)+,d0-d1/a5-a6
.exit rts
.turnon or.w #$700,sr
dc.w $4E7A,$0002 movec cacr,d0
dc.w $4E7A,$1808 movec pcr,d1
and.l #$F8E0E000,d0 mask all 060 used bits
and.l #$00000083,d1 ditto
move.l d0,_gcoldcacr store old values
move.l d1,_gcoldpcr for restore
and.l #~$D8006000,d0 EDC off, NAD off, DPI off, FOC off, NAI off, FIC off
or.l #$20808000,d0 enable store buffer, enable instruction cache, enable branch cache
or.w #$1,d1 enable superscalar dispatch
_restorego or.w #$700,sr
dc.w $4E7B,$0002 movec d0,cacr
dc.w $4E7B,$1808 movec d1,pcr
dc.w $F518,$F4F8,$F4D8
nop
rte
restore060caches
tst.b _AttnFlags+1 Test #AFB_68060
bpl.b .exit
movem.l d0-d1/a5-a6,-(sp)
move.l (4).w,a6
lea (_restorego,pc),a5
move.l _gcoldcacr,d0
move.l _gcoldpcr,d1
call Supervisor
movem.l (sp)+,d0-d1/a5-a6
.exit rts
CNOP 0,4
_gcUtilBase dc.l 0
_gcTimerBase dc.l 0
_gcStartE dc.l 0,0
_gcEndE dc.l 0,0
_gcETicker dc.l 0
_gcoldcacr dc.l 0
_gcoldpcr dc.l 0
; OUT: D0.l=100kHz
GetMHz_old movem.l d1-d3/d7/a5-a6,-(sp)
move.l (4).w,a6
moveq #0,d7
tst.l DraCoID
bne .draco
lea (sNoHW,pc),a0
tst.l NoHW
bne .printerr
moveq #MEMF_CHIP,d1 chipmem for 000, 010, 020 and 030
btst #AFB_68040,_AttnFlags+1
beq.b .tgoalloc
move.l #MEMF_FAST!MEMF_PUBLIC,d1 fastmem for 040 and 060
.tgoalloc
moveq #CPUTIMER_SIZEOF,d0
call AllocMem
tst.l d0
beq .exit
move.l d0,a5
move.l d0,a1
lea CPU_chiptiming,a0
moveq #CPUTIMER_SIZEOF,d0
call CopyMem
bsr InitTimer
lea (sNotimer,pc),a0
move.l d0,TimerBit
bmi.b .printerr
moveq #1,d1
lsl.l d0,d1
move.l d1,TimerMask
DBG 'itim'
move.l a5,a0
bsr DoTimer
move.l d0,CPUCompareTime
move.l d0,WAIndex
move.l TimerBit,d0
bsr RemTimer
DBG 'dtim'
move.l CPUID,d1
add.l d1,d1
move.w .SpeedCompareTable(pc,d1.l),d2
move.w d2,d3
lsr.w #1,d3 \
ext.l d3 > add 0.5 for rounding
add.l CPUCompareTime,d3 /
divu.w d2,d3
move.w d3,d7
move.l (4).w,a6
move.l a5,a1
moveq #CPUTIMER_SIZEOF,d0
call FreeMem
.exit move.l d7,d0
movem.l (sp)+,d1-d3/d7/a5-a6
rts
.draco move.l #500,d7 50.0 MHz
bra.b .exit
.printerr pea (sCPU,pc)
move.l a0,-(sp)
lea (sMhzxxxErr,pc),a0
move.l sp,a1
bsr Printf
addq.l #8,sp
bra.b .exit
.SpeedCompareTable
dc.w 2542 000 7.09379 MHz 180355.75 !
dc.w 2542 010 7.09379 MHz 180355.75 !
dc.w 5771 020 14.18758 MHz 818761.57 !
dc.w 5771
dc.w 5771 030 50.00000 MHz 2885487.07 ! 25.00000 MHz 1443364!
dc.w 5771
dc.w 15396 040 40.00000 MHz 6158519.00 !
dc.w 15396
dc.w 15396
dc.w 46187 060 50.00000 MHz 23093284.5 !
dc.w 46187
dc.w 46187
; IN: D0.w=attnflags
; OUT: D0.l=FPUID, 0=n/a, 1=68881, 2=68882, 3=68040, 4=68060
GetMinFPUnum move.l d1,-(sp)
move.w d0,d1
moveq #NOMATH,d0
btst #AFB_68040,d1
beq.b .no_040FPU
btst #AFB_FPU40,d1
beq.b .exit
moveq #MC68040i,d0
tst.b d1 Test #AFB_68060
bpl.b .exit
moveq #MC68060i,d0
bra.b .exit
.no_040FPU moveq #0,d0
btst #AFB_68882,d1
beq.b .no882
moveq #MC68882,d0
bra.b .exit
.no882 btst #AFB_68881,d1
beq.b .no881
moveq #MC68881,d0
;bra.b .exit
.no881
.exit move.l (sp)+,d1
rts
; IN: D0.w=attnflags
; OUT: D0.l=100kHz<<16+FPUID, 0=n/a, 1=68881, 2=68882, 3=68040, 4=68060
GetFPU movem.l d1-a6,-(sp)
bsr GetMinFPUnum
move.l d0,d7
beq.b .exit
tst.l DraCoID
bne.b .draco
lea (sNoHW,pc),a0
tst.l NoHW
bne.b .printerr
bsr InitTimer
lea (sNotimer,pc),a0
move.l d0,TimerBit
bmi.b .printerr
moveq #1,d1
lsl.l d0,d1
move.l d1,TimerMask
DBG 'fiti'
lea FPU_chiptiming,a0
;; bsr DoTimer
move.l d0,FPUCompareTime
move.l TimerBit,d0
bsr RemTimer
DBG 'fdti'
; on 881 8 fadd/fsub take 8*51 cycles
; on 882 8 fadd fsub (8*56)-(8*17) cycles
move.l d7,d1
add.l d1,d1
move.w .SpeedCompareTable-2(pc,d1.l),d2
;move.w d2,d3
;lsr.w #1,d3 \
;ext.l d3 > add 0.5 for rounding
;add.l FPUCompareTime,d3 /
move.l FPUCompareTime,d3
divu.w d2,d3
swap d7
move.w d3,d7
swap d7
.exit move.l d7,d0
movem.l (sp)+,d1-a6
rts
; Should use CPU MHz as default instead :)
.draco or.l #500<<16,d7 50.0 MHz
bra.b .exit
.printerr pea (sFPU,pc)
move.l a0,-(sp)
lea (sMhzxxxErr,pc),a0
move.l sp,a1
bsr Printf
addq.l #8,sp
bra.b .exit
.SpeedCompareTable
dc.w 1126680/16/500 881
dc.w 173203/500 882 50.00000 MHz 112669
dc.w 225*8 040 40.00000 MHz
dc.w 225*16 060 50.00000 MHz
; IN: GfxBase in _GfxBase
; OUT: d0=0=OCS, 1=ECS, 2=AGA, 3=CyberGfx, 4=Picasso96, 5=Probench, 6=EGS, 7=Retina,
; 8=Graffiti, 9=TIGA, 10=Altais
; d1=bandwidth (1, 2 or 4)
GetGfxLibEmul move.l d2,-(sp)
moveq #0,d0
move.w AnimChipID+2,d1
subq.w #5,d1
bmi.b .oldtestdone
moveq #1,d0
;; subq.w #8-4,d1
;; bmi.b .oldtestdone
.oldtestdone
moveq #1,d1
move.l _GfxBase,a0
cmp.w #37,(LIB_VERSION,a0)
blo.b .xit
move.b (gb_ChipRevBits0,a0),d2
move.b d2,d1
moveq #0,d0 OCS %10001
and.b #GFXF_HR_DENISE|GFXF_AA_LISA|GFXF_AA_ALICE,d1 %0xxx0
beq.b .done
moveq #2,d0 AGA %11111
cmp.b #GFXF_HR_DENISE|GFXF_AA_LISA|GFXF_AA_ALICE,d1
beq.b .done
moveq #1,d0 ECS %10011
;; cmp.b #GFXF_HR_DENISE,d1
;; beq.b .done
.done
moveq #0,d1
move.b (gb_MemType,a0),d1
and.b #3,d1
addq.l #1,d1
cmp.b #3,d1
bne.b .xit
subq.l #1,d1
.xit
bsr.b .getgfxg
move.l (sp)+,d2
tst.l d0
rts
; OUT: d0=0=OCS, 1=ECS, 2=AGA, 3=CyberGfx, 4=Picasso96, 5=Probench, 6=EGS, 7=Retina,
; 8=Graffiti, 9=TIGA, 10=Altais
; DosBase in _DosBase, ThisTask in _ThisTask
.getgfxg tst.b DraCoID
beq.b .not_altais
moveq #10,d0
rts
.not_altais movem.l d0-a6,-(sp)
move.l (ExecBase00,pc),a6
lea (.picassortg,pc),a1
lea (LibList,a6),a0
call FindName
tst.l d0
beq.b .notp96
move.l _DosBase,a6
lea (.pic962,pc),a0
move.l a0,d1
moveq #ACCESS_READ,d2
call Lock
move.l d0,d1
beq.b .notp96
call UnLock
lea (.picasso96api,pc),a1
moveq #0,d0
call OpenLibrary
tst.l d0
beq.b .notp96
move.l d0,a1
call CloseLibrary
moveq #4,d7
bra .exit
.notp96
lea (.cybergfx,pc),a1
lea (LibList,a6),a0
call FindName
; moveq #0,d0
; call OpenLibrary
tst.l d0
beq.b .notgg
; move.l d0,a1
; call CloseLibrary
move.l _ThisTask,a3
lea (pr_WindowPtr,a3),a3
move.l (a3),d3
moveq #-1,d0
move.l d0,(a3)
move.l _DosBase,a6
lea (.cybergfx3,pc),a0
move.l a0,d1
moveq #ACCESS_READ,d2
call Lock
move.l d0,d1
bne.b .isgg
lea (.cybergfx2,pc),a0
move.l a0,d1
call Lock
move.l d0,d1
beq.b .notgg2
.isgg call UnLock
move.l d3,(a3)
moveq #3,d7
bra.b .exit
.notgg2 move.l d3,(a3)
.notgg
move.l (ExecBase00,pc),a6
lea (.retina,pc),a1
lea (LibList,a6),a0
call FindName
tst.l d0
beq.b .not_retina
moveq #7,d7
move.l #$4754<<16+6,d0 Try to find Retina Z2
bsr FindConfigDev
bne.b .exit
move.l #$4754<<16+16,d0 Try to find Retina Z3
bsr FindConfigDev
bne.b .exit
.not_retina
lea (.egs,pc),a1
moveq #6,d7
bsr.b .test
lea (.graffiti,pc),a1
moveq #8,d7
bsr.b .test
lea (.tiga,pc),a1
moveq #9,d7
bsr.b .test
lea (.probench,pc),a1
moveq #5,d7
bsr.b .test
moveq #0,d7
.exit tst.l d7
beq.b .none
move.l d7,(sp)
.none movem.l (sp)+,d0-a6
rts
.test
; moveq #0,d0
; call OpenLibrary
lea (LibList,a6),a0
call FindName
tst.l d0
beq.b .texit
; move.l d0,a1
; call CloseLibrary
move.l #.exit,(sp)
.texit rts
.picassortg dc.b 'rtg.library',0
.pic962 dc.b 'DEVS:Picasso96Settings',0
.picasso96api dc.b 'Picasso96API.library',0
.cybergfx dc.b 'cybergraphics.library',0
.cybergfx2 dc.b 'ENVARC:CyberGraphics',0
.cybergfx3 dc.b 'ENVARC:CyberGraphX',0
.egs dc.b 'egs.library',0
.retina dc.b 'retina.library',0
.graffiti dc.b 'graffiti.library',0
.tiga dc.b 'gfx.library',0
.probench dc.b 'hrgblitter.library',0
CNOP 0,4
; OUT: D0.l=size of virtual memory in KB
GetVirtMem movem.l d1/a0-a1/a6,-(sp)
move.l (ExecBase00,pc),a6
lea (.vmemname,pc),a1
moveq #1,d0
call OpenLibrary
tst.l d0
beq.b .novmem
move.l d0,a6
moveq #1,d0 VMEMF_VIRTUAL
move.l #MEMF_TOTAL,d1
jsr (-$2A,a6) VMAvailMem
move.l d0,-(sp)
move.l a6,a1
move.l (ExecBase00,pc),a6
call CloseLibrary
move.l (sp)+,d0
.novmem movem.l (sp)+,d1/a0-a1/a6
beq.b .getit
movem.l d1-d2,-(sp)
move.l d0,d1
swap d1
and.l #$0FFFF,d1
divu.w #1024,d1
swap d1
clr.w d1
move.l d1,d2
lsl.l #8,d2
lsl.l #2,d2
sub.l d2,d0
divu.w #1024,d0
and.l #$0FFFF,d0
add.l d1,d0
movem.l (sp)+,d1-d2
rts
.getit move.l #(MEMF_PUBLIC!MEMF_CHIP!MEMF_LOCAL!MEMF_24BITDMA!MEMF_KICK)<<16+(MEMF_ANY),d0
bra.b GetMem
.vmemname dc.b 'vmem.library',0
CNOP 0,4
; OUT: D0.l=size of fast memory in KB
GetFastMem move.l #(MEMF_PUBLIC!MEMF_CHIP!MEMF_FAST)<<16+(MEMF_PUBLIC!MEMF_FAST),d0
bra.b GetMem
; OUT: D0.l=size of chip memory in KB
GetChipMem move.l #(MEMF_PUBLIC!MEMF_CHIP!MEMF_FAST)<<16+(MEMF_PUBLIC!MEMF_CHIP),d0
; bra.b GetMem
; IN: d0=mask, d1=req
; OUT: D0.l=total size of memory with matching 'req' after masking req with 'mask'
GetMem movem.l d1-d3/a0/a6,-(sp)
move.w d0,d3
swap d0
move.w d0,d2
and.w d2,d3
move.l (ExecBase00,pc),a6
call Forbid
move.l (MemList,a6),a0
moveq #0,d0
.loop move.l (a0),d1
beq.b .done
move.w (MH_ATTRIBUTES,a0),d1
and.w d2,d1
cmp.w d3,d1
bne.b .nomatch
move.l (MH_UPPER,a0),d1
sub.l (MH_LOWER,a0),d1
subq.l #1,d1
lsr.l #8,d1
lsr.l #6,d1
addq.l #1,d1
lsl.l #4,d1
add.l d1,d0
.nomatch move.l (a0),a0
bra.b .loop
.done
call Permit
movem.l (sp)+,d1-d3/a0/a6
rts
; OUT: D0=version<<16+revision, or null if wblib
GetWBVersion movem.l d1-a6,-(sp)
moveq #0,d7
move.l (ExecBase00,pc),a6
lea (.versionname,pc),a1
moveq #0,d0
call OpenLibrary
tst.l d0
beq.b .exit
move.l d0,a1
move.l (LIB_VERSION,a1),d7
call CloseLibrary
.exit move.l d7,d0
movem.l (sp)+,d1-a6
rts
.versionname dc.b 'version.library',0
CNOP 0,4
STRUCTURE prvSetPatchSemaphore,0
STRUCT prvsps_Sem,SS_SIZE
STRUCT prvsps_Private,MLH_SIZE
UWORD prvsps_Version
UWORD prvsps_Revision
; Don't touch
GetSetPatchVersion
movem.l d1-a6,-(sp)
moveq #0,d7
move.l (ExecBase00,pc),a6
cmp.w #36,(LIB_VERSION,a6)
blo.b .exit
lea (.semaname,pc),a1
call Forbid
call FindSemaphore
call Permit
tst.l d0
beq.b .exit
move.l d0,a0
move.l (prvsps_Version,a0),d7
.exit move.l d7,d0
movem.l (sp)+,d1-a6
rts
.semaname dc.b '« SetPatch »',0
CNOP 0,4
; OUT: D0=version<<16+revision
; d1=chksum
GetCRomVer movem.l d2-d3/a0-a1/a6,-(sp)
move.l (ExecBase00,pc),a6
move.l (LIB_IDSTRING,a6),d0
and.w #~3,d0
move.l d0,a0
move.l #$11104EF9,d0
move.l #$FFF8FFFF,d1
moveq #-1,d3
move.l a0,a1
.find move.l -(a0),d2
and.l d1,d2
cmp.l d2,d0
dbeq d3,.find
addq.w #1,d3
bne.b .addrok
move.l a1,d0
clr.w d0 Commodore does it this way...
move.l d0,a0
.addrok
;; lea ($1000).w,a1
;; move.l (a1),(a1) <- Fake access (NOT enforcer hit, though)
move.l (12,a0),d3
move.l #256*1024,d0
cmp.w #$1111,(a0)
beq.b .rom256k
add.l d0,d0
.rom256k jsr ROMReSum
move.l d0,d1
move.l d3,d0
movem.l (sp)+,d2-d3/a0-a1/a6
rts
; IN: D0.w=attnflags
; OUT: D0=version<<16+revision, zero if no "real" KS rom available
; d1=chksum, zero if no "real" KS rom available
GetChipRomVer movem.l d2-d7/a0-a6,-(sp)
move.l (ExecBase00,pc),a6
jsr getromver_novmem
move.l d6,d1
move.l d7,d0
movem.l (sp)+,d2-d7/a0-a6
rts
; OUT: D0=chipid, -1=unknown
GetAnimChip movem.l d1-d7/a0-a6,-(sp)
moveq #-1,d7
tst.l NoHW
bne.b .xit
moveq #1,d7
move.w $DFF004,d0
and.w #$7F00,d0
lsr.w #8,d0
bclr #4,d0
beq.b .skip
moveq #0,d7
.skip
cmp.b #$20,d0
beq.b .sa4
cmp.b #$21,d0
beq.b .sa6
cmp.b #$22,d0
beq.b .sa8
cmp.b #$23,d0
beq.b .saA
tst.b d0
bne.b .unknown
bsr.b .subr
bra.b .xit
.saA addq.b #2,d7
.sa8 addq.b #2,d7
.sa6 addq.b #2,d7
.sa4 addq.b #4,d7
.xit move.l d7,d0
movem.l (sp)+,d1-d7/a0-a6
rts
.unknown moveq #-1,d7
bra.b .xit
.subr move.l (ExecBase00,pc),a6 Test for 8361/8367 Agnus:
call Disable
moveq #32-1,d6 Multicheck: 32 times
move.l _GfxBase,a6
lea $DFF000,a5 Loads of preloads:
lea (bltsize,a5),a4
lea (dmaconr,a5),a3
moveq #$41,d4 Shortest possible blit
call OwnBlitter
move.w (a3),d5 Save dmacon
move.w #DMAF_BLITHOG,(dmacon,a5) <- No nasty blitter, please!
.blitloop call WaitBlit Do it right, but only here! :-O
move.w #$0E00,(bltcon0,a5) Dummy blit, no dest
bra.b .blitcnop
CNOP 0,4 Align to longword
.blitcnop move.w d4,(a4) / Fetched in \
move.w (a3),d0 \ one longword /
btst #DMAB_BLTDONE,d0 <- _Very_ old agnus
beq.b .old_agnus get this wrong!!!
dbf d6,.blitloop
addq.b #2,d7
.old_agnus or.w #$8000,d5 Restore dmacon
move.w d5,(dmacon,a5)
call WaitBlit Wait blit to finish, if any
call DisownBlitter
move.l (ExecBase00,pc),a6
call Enable
rts
; \/ Now this should work with OCS *much* better!? \/
; OUT: D0=chipid, 0=OCS denise, 1=ECS denise, 2=AGA Lisa, 3=AAA Lisa, 4=Unknown
; d1.w=revision number, or -1 if OCS
GetGfxChip movem.l d2-d3/d7/a0/a5/a6,-(sp)
moveq #-1,d1
moveq #4,d0
tst.l NoHW
bne.b .exit
lea $DFF000,a5
move.l (ExecBase00,pc),a6
call Disable
moveq #0,d7
lea ($7C,a5),a0 Preload denise/lisa ID hw addr
move.w #$FF,d3 Preload 'and' value
moveq #1-1,d0 !! These two just disable the
bsr HWWait !! annoying flick effect...
move.w (dmaconr,a5),d1 Save old dmacon
or.w #DMAF_SETCLR,d1
move.w #$3FF,(dmacon,a5) Disable all dma
move.w (a0),d0 !! OCS denise gives value $FFFF
;! when all dma is off (hmm?)
move.w d1,(dmacon,a5) Enable dma again
not.w d0 !! Well, my old trusty A500 does!!
beq.b .OCS !! (CAN'T BE SURE ABOUT THIS)
move.w (a0),d0 Get ID
and.w d3,d0
moveq #128-1,d2 Check 128 times (try to notice old denise random)
.loop move.w (a0),d1 Get ID again
and.w d3,d1
cmp.b d0,d1 Same value?
bne.b .OCS Not the same value, then OCS Denise
dbf d2,.loop
cmp.b #$FC,d0
beq.b .ECS
or.b #%11110000,d0 Mask AGA revision
cmp.b #%11111000,d0 Bit 3=AGA
beq.b .AGA
cmp.b #%11110000,d0 Bit 3=0 => AAA
beq.b .AAA
addq.l #1,d7 4 is Unknown
.AAA addq.l #1,d7 3 is AAA
.AGA addq.l #1,d7 2 is AGA
.ECS addq.l #1,d7 1 is ECS
.OCS move.l d7,d0 0 is OCS
call Enable
tst.b d0
beq.b .skip_OCS
and.w #%11110000,d1
lsr.b #4,d1
neg.b d1
add.b #$F,d1
.exit movem.l (sp)+,d2-d3/d7/a0/a5/a6
rts
.skip_OCS moveq #-1,d1
bra.b .exit
; IN: A0=FmtString, A1=Array, a2=Buffer
; OUT: Formatted text
Sprintf movem.l a0-a3/a6/d0-d1,-(sp)
move.l a2,a3
lea (.putchar,pc),a2
move.l (ExecBase00,pc),a6
call RawDoFmt
movem.l (sp)+,a0-a3/a6/d0-d1
rts
.putchar move.b d0,(a3)+
rts
; IN: A0=FmtString, A1=Array (may be 0)
; OUT: Printed text
Printf movem.l a0-a3/a6/d0-d3,-(sp)
lea pf_Data,a3
move.l a5,(a3)+
clr.l (a3)+
lea (.newchar,pc),a2
move.l (ExecBase00,pc),a6
call RawDoFmt
move.l a5,a6
move.l OutputFH,d1
move.l a3,d2
move.l (-4,a3),d3
call Write
movem.l (sp)+,a0-a3/a6/d0-d3
rts
.newchar movem.l d0-d3/a0-a1/a3/a6,-(sp)
move.l a3,d2 for Write()
move.l -(a3),d1
move.b d0,4(a3,d1.l)
addq.b #1,d1
move.l d1,(a3)
bne.b .dont_print
move.l -(a3),a6
move.l OutputFH,d1
moveq #64,d3
lsl.w #2,d3
call Write
.dont_print movem.l (sp)+,d0-d3/a0-a1/a3/a6
rts
; a0=timer routine (should be in chipmem)
; OUT: D0.l=compare time
DoTimer movem.l d1-a6,-(sp)
move.l a0,a5
lea $DFF000,a4
move.l (ExecBase00,pc),a6
move.l _ThisTask,a1
moveq #127,d0
call SetTaskPri
move.l d0,-(sp)
cmp.w #4,BandWidth
beq.b .is_aga4x
move.l a6,-(sp)
move.l _GfxBase,a6
move.l (gb_ActiView,a6),d6 save view
sub.l a1,a1
call LoadView
moveq #3-1,d0
bsr HWWait
move.l (sp)+,a6
.is_aga4x
move.l a6,-(sp)
move.l _GfxBase,a6
call WaitBlit Wait possible blit to finish.
move.l (sp)+,a6
jsr ChipTiming2
move.l d0,d7
cmp.w #4,BandWidth Restore view, if needed
beq.b .is_aga4x2
move.l a6,-(sp)
move.l _GfxBase,a6
move.l d6,a1
call LoadView
moveq #3-1,d0
bsr HWWait
;; move.l (gb_copinit,a6),(cop1lc,a4) Kick copper into life
move.l (sp)+,a6
.is_aga4x2
move.l _ThisTask,a1
move.l (sp)+,d0
call SetTaskPri
move.l d7,d0
movem.l (sp)+,d1-a6
rts
HWWait movem.l d0-d2/a0,-(sp)
tst.l NoHW
bne.b .nohw
lea $DFF006,a0
moveq #-1,d2
.wait1 move.b (a0),d1
cmp.b d2,d1
bne.b .wait1
.wait2 move.b (a0),d1
cmp.b d2,d1
beq.b .wait2
dbf d0,.wait1
.exit movem.l (sp)+,d0-d2/a0
rts
.nohw addq.l #1,d0
bsr WaitBlanks Will break Forbid() or Disable()
bra.b .exit
; OUT: d0=iCRBit (now result is LONG negative if failed to get cia)
InitTimer movem.l d1/d7/a0-a1/a5-a6,-(sp)
move.l (ExecBase00,pc),a6
moveq #-1,d7 for .noresource
lea (_CiabName,pc),a1
call OpenResource
move.l d0,CiabResource
beq.b .noresource
move.l d0,a5
moveq #IS_SIZE,d0
move.l #MEMF_PUBLIC!MEMF_CLEAR,d1 No virtmem please!
call AllocMem
move.l d0,_CiaInterrupt
beq.b .nomem
move.l d0,a1
addq.l #LN_TYPE,a1
move.w #NT_INTERRUPT<<8+127,(a1)+
lea (CiaIntName,pc),a0
move.l a0,(a1)+
lea CiaIntData,a0
move.l a0,(a1)+
lea CiaIntCode,a0
move.l a0,(a1)+
moveq #1,d7
.allocloop move.l d7,d0
move.l _CiaInterrupt,a1
exg a5,a6
call AddICRVector
exg a5,a6
tst.l d0
beq.b .ciaok
dbf d7,.allocloop
.ciaok
tst.w d7
bpl.b .gottimer
move.l _CiaInterrupt,a1
clr.l _CiaInterrupt
moveq #IS_SIZE,d0
call FreeMem
.gottimer
.nomem
.noresource move.w d7,d0
ext.l d0
movem.l (sp)+,d1/d7/a0-a1/a5-a6
rts
; IN: d0=iCRBit
RemTimer movem.l d0-d1/a0-a1/a6,-(sp)
tst.l d0
bmi.b .exit
move.l CiabResource,d1
beq.b .xit
move.l d1,a6
move.l _CiaInterrupt,a1
call RemICRVector
move.l (ExecBase00,pc),a6
move.l _CiaInterrupt,a1
clr.l _CiaInterrupt
moveq #IS_SIZE,d0
call FreeMem
.exit clr.l CiabResource
.xit movem.l (sp)+,d0-d1/a0-a1/a6
rts
EvaluateFormulas
; move.l #MC68060,CPUID debug
; clr.l CardSlotID
; st A4000ID
movem.l d1-d7/a0-a6,-(sp)
move.l sp,EvalSpSave
moveq.l #0,d6 param array
lea (Formulas,pc),a1
.get_next move.l (a1)+,a0
; beq.b _eval_error <- n_e_v_e_r happens!!
; move.l d0,a0
move.l a1,-(sp)
bsr.b _EvaluateFormula
move.l (sp)+,a1
tst.l d0
beq.b .get_next
move.l (a0),d0
cmp.l #32,d0
bhs.b _eval_exit
bset d0,d6
bra.b .get_next
_eval_exit
_eval_error
;; move.l d6,WAIndex db
move.l EvalSpSave,sp
; tst.l d0 disabled - zero not possible!
; bne.b .ok
; lea (sNullStr,pc),a0
; move.l a0,d0
;.ok
movem.l (sp)+,d1-d7/a0-a6
rts
_eval_error2 lea (sEvalErr,pc),a0
move.l a0,d0
bra.b _eval_error
; A1=parameter array
_EvaluateFormula2
move.l a0,-(sp)
move.l a1,a0
bsr.b _EvaluateFormula
move.l (sp)+,a0
rts
; A0=parameter array
_EvaluateFormula
moveq #0,d0 orig result=0
moveq #0,d4 op-mode (AND)
moveq #0,d7 skipmode=OFF
.get_next_com move.l (a0)+,d1
lea (OperatorTable-8,pc),a1
.get_next_op addq.l #8,a1
move.l (a1)+,d2
beq.b _eval_error2
cmp.l d1,d2
bne.b .get_next_op
move.l (4,a1),a2
movem.l (a0),d1-d3
add.l (a1),a0
cmpa.w #0,a2
beq.b .evaluated
tst.b d7 handle skip-mode
bne.b .get_next_com << fixed!
tst.l (a1) handle first parameter
beq.b .not_addr_arg
move.l d1,a1
cmp.l #_EvaluateFormula2,a2 special handle for jump command
beq.b .not_addr_arg
cmpa.w #32,a1
bhs.b .std_addr_arg
btst d1,d6 test entry in param array
sne d1
ext.w d1
ext.l d1 d1.l=0/-1
bra.b .not_addr_arg
.std_addr_arg move.l (a1),d1
.not_addr_arg moveq #0,d0
movem.l d4-d7/a1-a6,-(sp)
jsr (a2)
movem.l (sp)+,d4-d7/a1-a6
tst.l d0
beq.b .d0zero
moveq #-1,d0 ensure d0=-1 on true-condition
.d0zero cmp.b d4,d0
bne.b .no_cond_satisfied
moveq #-1,d7
.no_cond_satisfied
bra .get_next_com
.evaluated rts
_EqualTo0 tst.l d1
seq d0
rts
_NotEqualTo0 tst.l d1
sne d0
rts
_Equal cmp.l d1,d2
seq d0
rts
_InsideBorders cmp.l d2,d1
blt.b .no_inside
cmp.l d3,d1
sle d0
.no_inside rts
_OutsideBorders cmp.l d2,d1
blt.b .is_outside
cmp.l d3,d1
sle d0
.is_outside not.b d0
rts
_NotEqual cmp.l d1,d2
sne d0
rts
_SetAndMode moveq #0,d4 AND-mode
moveq #-1,d0 result
rts
_SetOrMode moveq #-1,d4 OR-mode
moveq #0,d0 result
rts
OperatorTable dc.l '&',0,_SetAndMode
dc.l '!',0,_SetOrMode
dc.l '(',0,_EvaluateFormula
dc.l '->',4,_EvaluateFormula2
dc.l '=0',4,_EqualTo0
dc.l '<>0',4,_NotEqualTo0
dc.l '=',8,_Equal
dc.l '<>',8,_NotEqual
dc.l '<x<',12,_InsideBorders the edges are included
dc.l 'out',12,_OutsideBorders the edges aren't included
dc.l ')',0,0
dc.l '|',0,0
dc.l 0
_bitn SET 0
BIT MACRO
\1 EQU _bitn
_bitn SET _bitn+1
ENDM
; Define toggle-array bits
BIT _ISAGA
Formulas dc.l calculateAGA
dc.l calculateDraCo
dc.l calculateCD32
dc.l calculateCDTV
dc.l calculateA1400
dc.l calculateA1200
;X dc.l calculateWalker
dc.l calculateA4000T
dc.l calculateA4000
dc.l calculateA600
dc.l calculateA1000
dc.l calculateA3000
dc.l calculateA30UX
dc.l calculateA3000T
dc.l calculate2500
dc.l calculate500o
dc.l calculateA500e
dc.l calculateA2000e
dc.l calculateA500pe
dc.l calculateA2000pe
dc.l calculateA500p
dc.l calculateA2000p
dc.l calculateA500
dc.l calculateA2000
dc.l calculateAAA
; dc.l calculateA1200 debug move! (ought to be before Walker)
dc.l calc_default <- ALWAYS exits
; dc.l 0 <- Not needed!!
calculateAGA dc.l '&','=',GfxChipID,2,'<x<',AnimChipID,8,$B,'|',_ISAGA
calculateDraCo dc.l '&','<>0',DraCoID,'|',sDraCo
calculateCD32 dc.l '&','<>0',C2PID,'<>0',_ISAGA,'<>0',CD32NVRAMID
dc.l '<x<',RomVer,40<<16,INFINITE,'<x<',CPUID,MIN020,MAXCPU,'|',sCD32
calculateCDTV dc.l '&','<x<',ChipMem,1024,2048,'<>0',CDTVID,'<x<',CPUID,0,MAX040,'|',sCDTV
calculateA1400 dc.l '&','<x<',CPUID,MIN020,MAX020,'<x<',_100kHz,240,260,'=',ChipMem,2048
dc.l '<>0',_ISAGA,'<>0',CardSlotID
dc.l '<x<',RomVer,39<<16,INFINITE,'|',sAmiga1400
calculateA1200 dc.l '&','<>0',_ISAGA,'<>0',CardSlotID,'<x<',CPUID,MIN020,MAXCPU
dc.l '<x<',RomVer,30<<16,INFINITE,'<x<',ChipMem,1024,2048,'|',sAmiga1200
;?? ^^
;XcalculateWalker dc.l '&','<>0',_ISAGA,'<x<',RomVer,41<<16,INFINITE,'=0',CardSlotID
;?? ^^
;X dc.l '=',CPUID,MC68EC030,'=',_100kHz,400,'<x<',ChipMem,1024,2048,'|',sWalker
calculateA4000T dc.l '&','<>0',_ISAGA,'<x<',RomVer,40<<16,INFINITE,'=0',CardSlotID
;?? ^^
dc.l '<x<',CPUID,MAX040,MAXCPU,'=',ChipMem,2048,'<>0',A4000TID,'|',sAmiga4000T
calculateA4000 dc.l '&','<>0',_ISAGA,'<x<',RomVer,39<<16,INFINITE,'=0',CardSlotID
dc.l '<x<',CPUID,MIN030,MAXCPU,'=',ChipMem,2048,'<>0',A4000ID,'|',sAmiga4000
calculateA600 dc.l '&','=',GfxChipID,1,'<x<',AnimChipID,6,7
dc.l '<x<',RomVer,37<<16+175+1,INFINITE,'<x<',ChipMem,1024,2048
dc.l '<>0',CardSlotID,'|',sAmiga600
calculateA1000 dc.l '&','=',GfxChipID,0,'<x<',AnimChipID,0,1
dc.l '<x<',RomVer,30<<16,INFINITE,'<x<',ChipMem,256,512,'|',sAmiga1000
calculateA3000 dc.l '&','<x<',RomVer,35<<16,INFINITE,'=',GfxChipID,1
dc.l '<x<',AnimChipID,4,7,'<x<',ChipMem,1024,2048
dc.l '<x<',CPUID,MIN030,MAXCPU,'<>0',A3000ID,'|',sAmiga3000
calculateA30UX dc.l '&','<>0',UNIXID,'<x<',RomVer,35<<16,INFINITE,'=',GfxChipID,1
dc.l '<x<',AnimChipID,4,7,'<x<',ChipMem,1024,2048
dc.l '<x<',CPUID,MIN030,MAXCPU,'<>0',A3000ID,'|',sAmiga3000UX
calculateA3000T dc.l '&','<x<',RomVer,35<<16,INFINITE,'=',GfxChipID,1
dc.l '<x<',AnimChipID,4,7,'<x<',ChipMem,1024,2048
dc.l '<x<',CPUID,MIN030,MAXCPU,'<>0',A4000ID,'|',sAmiga3000T
calculate2500 dc.l '&','<>0',A2500ID,'<x<',RomVer,33<<16,INFINITE,'=',GfxChipID,0
dc.l '<x<',AnimChipID,4,5,'<x<',ChipMem,512,1024,'<x<',CPUID,MIN020,MAX030
dc.l '<x<',_100kHz,240,260,'|',sAmiga2500
calculate500o dc.l '&','<x<',RomVer,33<<16,INFINITE,'=',GfxChipID,0
dc.l '<x<',AnimChipID,2,3,'=',ChipMem,512,'|',sAmiga500old
calculateA500e dc.l '&','<>0',A500EID,'<x<',RomVer,33<<16,INFINITE,'=',GfxChipID,0
dc.l '<x<',AnimChipID,4,5,'<x<',ChipMem,512,2048,'<x<',CPUID,0,MAX040
dc.l '|',sAmiga500e
calculateA2000e dc.l '&','<>0',A2000EID,'<x<',RomVer,33<<16,INFINITE,'=',GfxChipID,0
dc.l '<x<',AnimChipID,4,5,'<x<',ChipMem,512,1024,'<x<',CPUID,0,MAXCPU
dc.l '|',sAmiga2000e
calculateA500pe dc.l '&','<>0',A500EID,'<x<',RomVer,37<<16,INFINITE,'=',GfxChipID,1
dc.l '<x<',AnimChipID,4,5,'<x<',ChipMem,1024,2048,'<x<',CPUID,0,MAX040
dc.l '|',sAmiga500Pluse
calculateA2000pe
dc.l '&','<>0',A2000EID,'<x<',RomVer,37<<16,INFINITE,'=',GfxChipID,1
dc.l '<x<',AnimChipID,4,5,'<x<',ChipMem,1024,2048,'<x<',CPUID,0,MAXCPU
dc.l '|',sAmiga2000Pluse
calculateA500p dc.l '&','=0',A500EID,'<x<',RomVer,37<<16,INFINITE,'=',GfxChipID,1
dc.l '<x<',AnimChipID,4,5,'<x<',ChipMem,1024,2048,'<x<',CPUID,0,MAX040
dc.l '|',sAmiga500Plus
calculateA2000p dc.l '&','=0',A2000EID,'<x<',RomVer,37<<16,INFINITE,'=',GfxChipID,1
dc.l '<x<',AnimChipID,4,5,'<x<',ChipMem,1024,2048,'<x<',CPUID,0,MAXCPU
dc.l '|',sAmiga2000Plus
calculateA500 dc.l '&','=0',A500EID,'<x<',RomVer,33<<16,INFINITE,'=',GfxChipID,0
dc.l '<x<',AnimChipID,4,5,'<x<',ChipMem,512,2048,'<x<',CPUID,0,MAX040
dc.l '|',sAmiga500
calculateA2000 dc.l '&','=0',A2000EID,'<x<',RomVer,33<<16,INFINITE,'=',GfxChipID,0
dc.l '<x<',AnimChipID,4,5,'<x<',ChipMem,512,1024,'<x<',CPUID,0,MAXCPU
dc.l '|',sAmiga2000
calculateAAA dc.l '=',GfxChipID,3,'|',sAmigaAAA
calc_default dc.l '<>0',calc_default,'|',sDefault
GfxChipTable
.s dc.w sDenise-.s,sECSDenise-.s,sAGALisa-.s,sAAALisa-.s,sUnknown-.s
dc.w sUnknown-AnimChipTable
AnimChipTable
.s dc.w sA0-.s,sA1-.s,sA2-.s,sA3-.s,sA4-.s,sA5-.s,sA6-.s,sA7-.s
dc.w sA8-.s,sA9-.s,sAA-.s,sAB-.s
CPUTable
.s dc.w s68000-.s,s68010-.s,s68EC020-.s,s68020-.s,s68EC030-.s
dc.w s68030-.s,s68EC040-.s,s68LC040-.s,s68040-.s
dc.w s68EC060-.s,s68LC060-.s,s68060-.s
;; dc.w sMPC603e-.s,sMPC604-.s,sMPC620-.s
FPUTable
.s dc.w sFna-.s,s68881-.s,s68882-.s,s68040f-.s,s68060f-.s
MMUTable
.s dc.w s68851-.s,s68030m-.s,s68040m-.s,s68060m-.s
GfxLibEmulTable
.s dc.w sOCS-.s,sECS-.s,sAGA-.s,sCyberGfxg-.s,sPicasso96g-.s,sProBenchg-.s
dc.w sEGSg-.s,sRetinag-.s,sGraffitig-.s,sTIGAg-.s,sAltaisg-.s
PowerPCTable
.s dc.w sPPCxx-.s,sPPCxx-.s,sPPCxx-.s
dc.w sPPC603-.s,sPPC604-.s,sPPC602-.s,sPPC603e-.s,sPPC603p-.s
dc.w sPPCxx-.s
dc.w sPPC604e-.s
PowerPCPLLTable
.s dc.w pllxx-.s,pllxx-.s,pllxx-.s
dc.w pll603-.s,pll604-.s,pll602-.s,pll603e-.s,pll603p-.s
dc.w pllxx-.s
dc.w pll604e-.s
pllxx
pll603
pll604
pll602
pll603e
pll603p
pll604e
dc.w 10 ; 0000
dc.w 10 ; 0001
dc.w 70 ; 0010
dc.w 10 ; 0011 PLL bypass
dc.w 20 ; 0100
dc.w 65 ; 0101
dc.w 25 ; 0110
dc.w 45 ; 0111
dc.w 30 ; 1000
dc.w 55 ; 1001
dc.w 40 ; 1010
dc.w 50 ; 1011
dc.w 15 ; 1100
dc.w 60 ; 1101
dc.w 35 ; 1110
dc.w 10 ; 1111
DosName dc.b 'dos.library',0
ExpName dc.b 'expansion.library',0
_GfxName dc.b 'graphics.library',0
_CiabName dc.b 'ciab.resource',0
CiaIntName dc.b 'WhichAmiga CIA interrupt',0
TimerDevName dc.b 'timer.device',0
ConsoleName dc.b 'CON:10/10/620/246/ WhichAmiga Copyright © 1995-1999 PitPlane Productions',0
NewConsoleName dc.b 'CON:10/10/620/246/WhichAmiga Copyright © 1995-1999 PitPlane Productions/CLOSE/AUTO/WAIT',0
PressReturn dc.b 10,$9B,'0 pPress <RETURN> to close window.',$9B,'30;40m',0
sNoHW dc.b 'No Amiga custom hardware available',0
sNotimer dc.b 'Severe trouble! No free CIA timer available',10
sMhzxxxErr dc.b '%s!',10
dc.b 'Unable to calculate %s clock frequency.',10,0
sCPU dc.b 'CPU',0
sFPU dc.b 'FPU',0
CursorOn dc.b $9B,' p',0
dc.b '$VER:'
sStart dc.b 'WhichAmiga 1.3.3 (2.5.99)',10
dc.b $9B,'0 p'
dc.b 'Written by Harry "Piru" Sintonen. Copyright © 1995-1999 PitPlane Productions.',10,10
dc.b 'Evaluating system...',10,0
;;sRaport dc.b 'Central Processing Unit: %s %d.%d MHz (%dx %s %dMHz WAIndex: %ld)',10
sRaport dc.b 'Central Processing Unit: %s %d.%d MHz%s',10
dc.b '%s'
dc.b ' Floating Point Unit: %s',10
dc.b ' Memory Management Unit: %s %s',10
dc.b ' Custom graphics chip: %s%s',10
dc.b ' Custom animation chip: %s',10
dc.b ' Other custom chip(s): %s',10
dc.b ' Graphics system: %s%s',10
dc.b '%s%s'
dc.b '%s'
dc.b '%s%s'
dc.b ' Hardware Clock: %s',10
dc.b ' Max. Chipmem available: %ld K',10
dc.b ' Max. Fastmem available: %ld K',10
dc.b '%s'
dc.b ' ROM chip version: %d.%d (Kickstart %s)',10
dc.b '%s'
dc.b ' Workbench version: %d.%d (Workbench %s)',10
dc.b ' SetPatch version: %s',10
dc.b '%s'
dc.b 10
dc.b ' Your computer %s%s.',10
dc.b 0
sRev dc.b ' (rev %d)',0
sReKickROM dc.b ' ReKicked ROM, version: %d.%d (Kickstart %s)',10,0
sHWC2P dc.b ' Chunky-to-planar conv: available',10,0
sGfxBoards dc.b ' Graphics board(s): ',0
sSndCards dc.b ' Soundcard(s): ',0
;sFPUFmt dc.b '%s %d.%d MHz (%ld)',0
sFPUFmt dc.b '%s',0
sVirtMemFmt dc.b ' Max. Virtmem available: %ld K',10,0
sDBWFmt dc.b ' display bandwidth: %dx',0
sPowerUPFmt0 dc.b '%2ld PowerUP Processor(s):',0
sPowerUPFmt1 dc.b ' PPC %s %ld MHz (rev %d.%d), %ld MHz busclock',0
sProcInfo060Fmt dc.b ' (rev %d)',0
sSetPatchVerFmt dc.b '%d.%d',0
sOCS dc.b 'Amiga OCS',0
sECS dc.b 'Amiga ECS',0
sAGA dc.b 'Amiga AGA',0
sCyberGfxg dc.b 'CyberGraphX',0
sPicasso96g dc.b 'Picasso96',0
sProBenchg dc.b 'ProBench',0
sEGSg dc.b 'EGS',0
sRetinag dc.b 'Retina',0
sGraffitig dc.b 'Graffiti',0
sTIGAg dc.b 'TIGA',0
sAltaisg dc.b 'Altais',0
sDenise dc.b 'OCS Denise 8362',0
sECSDenise dc.b 'ECS Denise 8373',0
sAGALisa dc.b 'AGA Lisa 4203',0
sAAALisa dc.b 'AAA Lisa?',0
sA0 dc.b 'OCS NTSC Agnus 8361',0 10
sA1 dc.b 'OCS PAL Agnus 8367',0 00
sA2 dc.b 'OCS NTSC Fat Agnus 8370',0 10
sA3 dc.b 'OCS PAL Fat Agnus 8371',0 00
sA4 dc.b 'ECS NTSC Fatter Agnus 8372a, 1MB',0 30
sA5 dc.b 'ECS PAL Fatter Agnus 8372a, 1MB',0 20
sA6 dc.b 'ECS NTSC Super Agnus 8372b, 2MB',0 31
sA7 dc.b 'ECS PAL Super Agnus 8372b, 2MB',0 21
sA8 dc.b 'AGA NTSC Alice 8374, thru rev 2',0 32
sA9 dc.b 'AGA PAL Alice 8374, thru rev 2',0 22
sAA dc.b 'AGA NTSC Alice 8374, rev 3-4',0 33
sAB dc.b 'AGA PAL Alice 8374, rev 3-4',0 23
sAxx dc.b 'ECS Super Agnus 8375, 2MB',0 ??
sUnknown dc.b 'Unknown',0
s68000 dc.b 'MC68000',0
s68010 dc.b 'MC68010',0
s68EC020 dc.b 'MC68EC020',0
s68020 dc.b 'MC68020',0
s68EC030 dc.b 'MC68EC030',0
s68030 dc.b 'MC68030',0
s68EC040 dc.b 'MC68EC040',0
s68LC040 dc.b 'MC68LC040',0
s68040 dc.b 'MC68040',0
s68EC060 dc.b 'MC68EC060',0
s68LC060 dc.b 'MC68LC060',0
s68060 dc.b 'MC68060',0
;;sMPC603e dc.b 'MPC603e',0
;;sMPC604 dc.b 'MPC604',0
;;sMPC620 dc.b 'MPC620',0
s68881 dc.b 'MC68881',0
s68882 dc.b 'MC68882',0
s68040f dc.b '68040fpu',0
s68060f dc.b '68060fpu',0
s68851 dc.b 'MC68851',0
s68030m dc.b '68030mmu',0
s68040m dc.b '68040mmu',0
s68060m dc.b '68060mmu',0
sPaula dc.b 'Paula 8364 (rev %d)',0
sRamsey dc.b 'Ramsey (rev %d)',0
sGary dc.b 'Gary (rev %d)',0
sGayle dc.b 'Gayle (rev %d)',0
sAkiko dc.b 'Akiko C2P',0
sSuperIO dc.b 'SuperIO (rev %d)',0
sBuster dc.b 'Buster (rev %d)',0
sRunningStr dc.b 'running',0
sNotActiveStr dc.b 'not active',0
sPPC603 dc.b '603',0
sPPC604 dc.b '604',0
sPPC602 dc.b '602',0
sPPC603e dc.b '603e',0
sPPC603p dc.b '603p',0
sPPC604e dc.b '604e',0
sPPCxx dc.b '???',0
sFna
sMMUna
sNA
sGfxEmulna dc.b 'not available',0
sNullStr EQU *-1
sClockFound dc.b 'clock found',0
sEvalErr dc.b 'ok, but evaluating code didn''t work! ;)',0
sUAE dc.b ', run by UAE Amiga Emulator',0
sAmiga1000 dc.b 'is an Amiga 1000',0
sAmiga500old dc.b 'is an old Amiga 500',0
sAmiga500 dc.b 'probably is an Amiga 500',0
sAmiga500e dc.b 'is an expanded Amiga 500',0
sAmiga500Plus dc.b 'probably is an Amiga 500+',0
sAmiga500Pluse dc.b 'is an expanded Amiga 500+',0
sAmiga600 dc.b 'is an Amiga 600',0
sAmiga1200 dc.b 'is an Amiga 1200',0
sAmiga1400 dc.b 'is an Amiga 1400',0
sAmiga2000 dc.b 'probably is an Amiga 2000',0
sAmiga2000e dc.b 'is an expanded Amiga 2000',0
sAmiga2000Plus dc.b 'probably is an Amiga 2000+',0
sAmiga2000Pluse dc.b 'is an expanded Amiga 2000+',0
sAmiga2500 dc.b 'is an Amiga 2500',0
sAmiga3000 dc.b 'is an Amiga 3000',0
sAmiga3000UX dc.b 'is an Amiga 3000UX',0
sAmiga3000T dc.b 'is an Amiga 3000 Tower',0
sAmiga4000 dc.b 'is an Amiga 4000',0
sAmiga4000T dc.b 'probably is an Amiga 4000 Tower',0
sCD32 dc.b 'is an Amiga CD³²',0
sCDTV dc.b 'is an Amiga CDTV',0
;XsWalker dc.b 'is Amiga Techologies'' Walker',0
sDraCo dc.b 'is MacroSystems'' DraCo (Amiga-clone)',0
sAmigaAAA dc.b 'probably is a new AAA Amiga (portable? PowerAmiga?)',0
sDefault dc.b 'is some Amiga or compatible',0
GFXBRD MACRO
dc.l (($\1)<<16)!\2,\3
ENDM
; $140C 2 'US Interface Ltd. Magic graphics',0
; $140C 130 'US Interface Ltd. Magic graphics (Prototype)',0
CNOP 0,4
GfxBoardTable
GFXBRD 07E1,32,sIV24
GFXBRD 06E1,32,sIV24
GFXBRD 0891,2,sEGS
GFXBRD 0838,0,sIF24 NTSC
GFXBRD 0838,1,sIF24 PAL
GFXBRD 0851,1,sResolver
GFXBRD 0851,2,sVivid24
GFXBRD 086A,3,sVoyager
GFXBRD 086A,2,sBlackbox
GFXBRD 086A,1,sHorizon
GFXBRD 085E,1,sGDA
GFXBRD 0406,0,sA2410
GFXBRD 03EC,245,sA2410kronos
GFXBRD 0845,2,sVisiona
GFXBRD 0845,4,sMerlin
GFXBRD 2140,34,sCyberVision
GFXBRD 07E1,68,sRembrandt
GFXBRD 0872,2,sDomino
GFXBRD 0893,5,sPiccolo (actually Piccolo Memory)
GFXBRD 0893,11,sPiccoloSD64
GFXBRD 0877,12,sPicassoII
GFXBRD 0877,13,sPicassoII
GFXBRD 4754,6,sRetinaZ2
GFXBRD 4754,16,sRetinaZ3
GFXBRD 0861,33,sRainbowIII
GFXBRD 0877,24,sPicassoIV
GFXBRD 2140,50,sCyberVision3D
GFXBRD 2140,67,sCyberVision3D
GFXBRD 4754,19,sAltais
GFXBRD 041D,20,s1600GX
; GFXBRD 2140,13,sIV24 db
; GFXBRD 2140,13,sEGS
; GFXBRD 2140,13,sResolver Testing 1.2.3...
; GFXBRD 2140,13,sA2410
dc.l 0
sA2410 dc.b 'Lowell A2410',0
sA2410kronos dc.b 'Kronos/C Ltd A2410',0
sIV24 dc.b 'Impact Vision 24',0
sEGS dc.b 'EGS Spectrum',0
sIF24 dc.b 'FireCracker 24',0
sResolver dc.b 'Resolver',0
sVivid24 dc.b 'Vivid 24',0
sGDA dc.b 'GDA-1',0
sHorizon dc.b 'Horizon',0
sBlackbox dc.b 'Blackbox',0
sVoyager dc.b 'Voyager',0
sVisiona dc.b 'Visiona',0
sMerlin dc.b 'Merlin',0
sCyberVision dc.b 'CyberVision 64',0
sRembrandt dc.b 'Rembrandt',0
sDomino dc.b 'Domino',0
sPiccolo dc.b 'Piccolo',0
sPiccoloSD64 dc.b 'PiccoloSD-64',0
sPicassoII dc.b 'Picasso II',0
sRetinaZ2 dc.b 'Retina Z2',0
sRetinaZ3 dc.b 'Retina Z3',0
sRainbowIII dc.b 'Rainbow III',0
sAltais dc.b 'Altais Card',0
s1600GX dc.b '1600-GX',0
sCyberVision3D dc.b 'CyberVision 64/3D',0
sPicassoIV dc.b 'Picasso IV',0
CNOP 0,4
SNDCRD MACRO
dc.l (($\1)<<16)!\2,\3
ENDM
CNOP 0,4
SndCardTable
SNDCRD 0840,191,sWavetools
SNDCRD 38A5,0,sDelfina
SNDCRD 4231,1,sPrelude
SNDCRD 4754,3,sMaestro
SNDCRD 4754,5,sMaestroPro
SNDCRD 4754,12,sToccata
SNDCRD 4754,13,sToccataPro
SNDCRD 38A5,1,sDelfinaLITE
; SNDCRD 2140,13,sDelfina db
; SNDCRD 2140,13,sMaestroPro
dc.l 0
sWavetools dc.b 'Wavetools',0
sDelfina dc.b 'Delfina DSP',0
sPrelude dc.b 'Prelude',0
sMaestro dc.b 'Maestro',0
sMaestroPro dc.b 'MaestroPro',0
sToccata dc.b 'Toccata',0
sToccataPro dc.b 'ToccataPro',0
sDelfinaLITE dc.b 'Delfina LITE',0
CNOP 0,4
ExecBase00 dc.l 'EXEC'
CNOP 0,4
;; SECTION BSS,BSS
;;ExecBase01 ds.l 1
Params
CPU ds.l 1
MHz ds.l 1
procinfo_ptr ds.l 1
;Multiplier ds.w 1
;CmpCPU_ptr ds.l 1
;CmpCPUMHz ds.w 1
;WAIndex ds.l 1
PowerUP_ptr ds.l 1
FPU_ptr ds.l 1
MMU ds.l 1
MMUStatus ds.l 1
GfxChip ds.l 1
GfxChipRev_ptr ds.l 1
AnimChip ds.l 1
CustomChips ds.l 1
GfxLibEmul_ptr ds.l 1
BandWidth_ptr ds.l 1
GfxBoardI ds.l 1
GfxBoard ds.l 1
C2P ds.l 1
SndCardI ds.l 1
SndCard ds.l 1
HWClock_ptr ds.l 1
ChipMemd ds.l 1
FastMem ds.l 1
VirtMem_ptr ds.l 1
RomVer ds.l 1
RomVerS ds.l 1
ReKickROM_ptr ds.l 1
WBVer ds.l 1
WBVerS ds.l 1
SetPatchVerPtr ds.l 1
ExpBoards_ptr ds.l 1
MachineGuess ds.l 1
AfterMG_ptr ds.l 1
CPUCompareTime ds.l 1
FPUCompareTime ds.l 1
CPUID ds.l 1
EC ds.l 1
_EC ds.l 1
GfxLibEmul ds.l 1
CRomVer ds.l 1 \
CRomVerS ds.l 1 /
CRomChkSum ds.l 1
RomChkSum ds.l 1
;RamseyGaryRev
RamseyRev ds.w 1
GaryRev ds.w 1
GfxChipRev ds.w 1
ds.w 1
GfxChipID ds.l 1
AnimChipID ds.l 1
FPUID ds.l 1
CardSlotID ds.l 1
DraCoID ds.l 1
PowerUPID ds.l 1
UAEID ds.l 1
GayleRev ds.w 1
PaulaRev ds.w 1
AGAGayleID ds.l 1
A690ID ds.l 1
CDTVID ds.l 1
ATIDEID ds.l 1
C2PID
AkikoID ds.l 1
CD32NVRAMID ds.l 1
UNIXID ds.l 1
A500EID ds.l 1
A2000EID ds.l 1
A3000ID ds.l 1
A4000ID ds.l 1
A4091ID ds.l 1
Phase5ID ds.l 1
A4000TID ds.l 1
A2500ID ds.l 1
_100kHz ds.l 1
HWClockID ds.l 1
VirtMem ds.l 1
AddrBits ds.l 1
BandWidth ds.w 1
ds.w 1 Align
_ThisTask ds.l 1
_Args ds.l 1
_DosBase ds.l 1
_ExpBase ds.l 1
_wasDSACK ds.l 1
_CiaInterrupt ds.l 1
NewKick ds.l 1
WBMode ds.l 1
OutputFH ds.l 1
EvalSpSave ds.l 1
ChipMem ds.l 1
; disabled this x thing:
Multiplier ds.w 1
CmpCPU_ptr ds.l 1
CmpCPUMHz ds.w 1
WAIndex ds.l 1
pf_Data ds.l 1 dosbase
ds.l 1 cnt
ds.b 256 text-buffer
FPUBuffer ds.b 32
GfxBoardBuffer ds.b 256
SndCardBuffer ds.b 256
sVirtMemBuf ds.b 80
sROMBuf ds.b 80
ChipsBuffer ds.b 80+2
GChipRevBuffer ds.b 20
DBWBuffer ds.b 32
ExpBoardsBuffer ds.b (10+10+6+4+48+48)*20
sPowerUPBuf ds.b 80*8
sSetPatchBuf ds.b 16
sPI060Buffer ds.b 32
SECTION CODE_C,CODE_C Virtmem sensitive parts:
ExecBase02 dc.l 'EXEC'
include "utility/utility_lib.i"
IFND _LVOReadEClock
_LVOReadEClock EQU -$3C
ENDC
CNOP 0,4
; IN: a0=init_routine, a1=time_routine, a2=cleanup_routine
; OUT: d0=microseconds time_routine took to execute, -1 for error
;NOTE: init_time_routine may change cache settings, loadview(0) etc.
; do NOT change a5!
TimeRoutine
STRUCTURE mytimerstuff,0
APTR mts_execbase
APTR mts_timerbase
APTR mts_utilitybase
STRUCT mts_beg_eclockval,EV_SIZE
STRUCT mts_end_eclockval,EV_SIZE
;
APTR mts_init_routine
APTR mts_time_routine
APTR mts_cleanup_routine
ULONG mts_eclockfreq
;
APTR mts_ciabbase
ULONG mts_timerbit
ULONG mts_timermask
UWORD mts_oldAbleICRmask
UWORD mts_oldSetICRmask
APTR mts_ciabcrx
APTR mts_ciabtxlo
STRUCT mts_IS,IS_SIZE
ALIGNLONG
STRUCT mts_icode,8
LABEL mts_fullrounds
ULONG mts_idata
ULONG mts_idata_add
LABEL mts_SIZEOF
movem.l d1-a6,-(sp)
moveq #-1,d7
move.l (4).w,a6
cmp.w #36,(LIB_VERSION,a6)
shs d6
move.l a0,d2
move.l a1,d3
move.l a2,d4
move.l #mts_SIZEOF,d0
move.l #MEMF_PUBLIC!MEMF_CLEAR,d1 No virtmem please!
call AllocMem
tst.l d0
beq .exit
move.l d0,a5
move.l a6,(mts_execbase,a5)
move.l d2,(mts_init_routine,a5)
move.l d3,(mts_time_routine,a5)
move.l d4,(mts_cleanup_routine,a5)
tst.b d6
beq.b .nov36a
lea (DeviceList,a6),a0
lea (.timername,pc),a1
call Forbid
call FindName
call Permit
move.l d0,(mts_timerbase,a5)
beq .free
bra .got_timerbase
.nov36a
move.l #709379,(mts_eclockfreq,a5)
cmp.b #50,(PowerSupplyFrequency,a6)
beq.b .was_pal
move.l #715909,(mts_eclockfreq,a5)
cmp.b #60,(PowerSupplyFrequency,a6)
bne .free
.was_pal
lea (.ciabname,pc),a1
call OpenResource
move.l d0,(mts_ciabbase,a5)
beq .free
lea (mts_IS+LN_TYPE,a5),a1
move.w #NT_INTERRUPT<<8+127,(a1)+
lea (.ciaintname,pc),a0
move.l a0,(a1)+
lea (mts_idata,a5),a0
move.l a0,(a1)+
lea (mts_icode,a5),a0
move.l a0,(a1)+
move.l #$2029<<16!mts_idata_add-mts_idata,(a0)+ ;move.l (mts_idata_add-mts_idata,a1),d0
move.l #$D1914E75,(a0) ;add.l d0,(a1); rts
move.l #$10000,(mts_idata_add,a5)
bsr .cacheclear
call Disable
move.l (mts_ciabbase,a5),a6
moveq #1,d2
.allocloop move.l d2,d0
lea (mts_IS,a5),a1
call AddICRVector
tst.l d0
beq.b .ciaok
dbf d2,.allocloop
bra.b .no_timer
.ciaok move.w d2,d0
move.l d2,(mts_timerbit,a5)
moveq #1,d0
lsl.l d2,d0
move.l d0,(mts_timermask,a5)
call SetICR Clear timer interrupt
or.w #$80,d0
move.w d0,(mts_oldSetICRmask,a5)
move.l (mts_timermask,a5),d0 Disable timer interrupt
call AbleICR
or.w #$80,d0
move.w d0,(mts_oldAbleICRmask,a5)
.no_timer move.l (mts_execbase,a5),a6
call Enable
tst.w d2
bmi .free
move.l (mts_timerbit,a5),d0
lsl.l #8,d0
lea CIAB+ciacra,a0
add.w d0,a0
move.l a0,(mts_ciabcrx,a5)
add.w d0,d0
lea CIAB+ciatalo,a0
add.w d0,a0
move.l a0,(mts_ciabtxlo,a5)
move.l (mts_ciabcrx,a5),a0 Stop timer, set continuos mode, count 02 pulses
clr.b (a0)
move.l (mts_ciabtxlo,a5),a0 Set timeout (counter)
st (a0)
st ($100,a0)
move.l (mts_ciabbase,a5),a6
move.l (mts_timermask,a5),d0
or.w #$80,d0 Enable timer interrupt
call AbleICR
move.l (mts_init_routine,a5),d0
beq.b .noinita
move.l d0,a0
jsr (a0)
.noinita movem.l d0-d1/a0-a1,-(sp)
move.l (mts_ciabcrx,a5),a0 set OUTMODE(?), RUNODE=cont, LOAD counter, START
move.b #%00010101,(a0)
movem.l (sp)+,d0-d1/a0-a1
move.l (mts_time_routine,a5),a0
jsr (a0)
move.l (mts_ciabcrx,a5),a0 Stop timer.
clr.b (a0)
move.l (mts_cleanup_routine,a5),d0
beq.b .nocleana
move.l d0,a0
jsr (a0)
.nocleana
; stopped
moveq #0,d1
move.l (mts_ciabtxlo,a5),a0 Get timer counter
move.l #$FFFF,d0
move.b ($100,a0),d1
lsl.l #8,d1
move.b (a0),d1
sub.l d1,d0 d0=count
add.l (mts_fullrounds,a5),d0 Add full timer rounds (rounds*$10000)
move.l d0,d2
move.l (mts_execbase,a5),a6
call Disable
move.l (mts_ciabbase,a5),a6
move.l (mts_timermask,a5),d0 Clear timer interrupt
call SetICR
move.l (mts_timermask,a5),d0 Disable timer interrupt
call AbleICR
move.w (mts_oldSetICRmask,a5),d0
call SetICR Set orig timer interrupt
move.w (mts_oldAbleICRmask,a5),d0
call AbleICR Enable orig interrupt
lea (mts_IS,a5),a1
call RemICRVector
move.l (mts_execbase,a5),a6
call Enable
;d2=EV_LO
.free move.l (mts_execbase,a5),a6
move.l a5,a1
move.l #mts_SIZEOF,d0
call FreeMem
.exit move.l d7,d0
movem.l (sp)+,d1-a6
rts
.cacheclear move.w (AttnFlags,a6),d0
btst #AFB_68020,d0
beq.b .cc_nocache
move.l a5,a0
lea (.cc_cachec,pc),a5
jmp (_LVOSupervisor,a6)
.cc_nocache rts
.cc_cachec move.l a0,a5
btst #AFB_68040,d0
bne.b .cc_040p
movec cacr,d0
or.w #CACRF_ClearI!CACRF_ClearD,d0
movec d0,cacr
rte
.cc_040p dc.w $F478 ; CPUSHA BC flush the data into memory
nop
rte
.got_timerbase lea (.utilityname,pc),a1
moveq #36,d0
call OpenLibrary
move.l d0,(mts_utilitybase,a5)
beq .free
move.l (mts_init_routine,a5),d0
beq.b .noinitb
move.l d0,a0
jsr (a0)
.noinitb movem.l d0-d1/a0-a1/a6,-(sp)
move.l (mts_timerbase,a5),a6
lea (mts_beg_eclockval,a5),a0
call ReadEClock
movem.l (sp)+,d0-d1/a0-a1/a6
move.l (mts_time_routine,a5),a0
jsr (a0)
move.l (mts_timerbase,a5),a6
lea (mts_end_eclockval,a5),a0
call ReadEClock
move.l d0,(mts_eclockfreq,a5)
move.l (mts_cleanup_routine,a5),d0
beq.b .nocleanb
move.l d0,a0
jsr (a0)
.nocleanb
move.l (mts_end_eclockval+EV_HI,a5),d0
cmp.l (mts_beg_eclockval+EV_HI,a5),d0
bne.b .closeu
;efreqmul=2000
;evalmul=1000000/efreqmul
;micros=eval*evalmul/efreq*efreqmul
efreqmul EQU 2000
evalmul EQU 1000000/efreqmul
move.l (mts_utilitybase,a5),a6
move.l (mts_eclockfreq,a5),d0
move.l #efreqmul,d1
call UMult32
move.l d0,d2 efreq*efreqmul
beq.b .closeu
move.l (mts_end_eclockval+EV_LO,a5),d0
sub.l (mts_beg_eclockval+EV_LO,a5),d0
IFGT 0
move.l #evalmul,d1
call UMult32 eval*evalmul
move.l d2,d1
call UDivMod32
;d0=micros=eval*evalmul/efreq*efreqmul
ENDC
move.l d0,d7
.closeu move.l (mts_execbase,a5),a6
move.l (mts_utilitybase,a5),a1
call CloseLibrary
bra .free
.timername dc.b 'timer.device',0
.utilityname dc.b 'utility.library',0
.ciabname dc.b 'ciab.resource',0
.ciaintname dc.b 'TimeRoutine cia-b interrupt',0
CNOP 0,4
; Test 68030, 68040 and 68882 WITHOUT system (for KS1.x use)
; IN: d2=attnflags, a6=execbase
; OUT: d0=updated attnflags
Test030_040_882 move.l a5,-(sp)
lea (.sv,pc),a5
call Supervisor
move.l (sp)+,a5
rts
.sv moveq #0,d0
btst #AFB_68020,d2
beq.b .not68020
movec cacr,d1
move.l d1,-(sp)
or.w #CACRF_WriteAllocate,d1
movec d1,cacr
movec cacr,d1
btst #CACRB_WriteAllocate,d1
beq.b .not68030
bset #AFB_68030,d0
.not68030 move.l (sp)+,d1
movec d1,cacr
movec cacr,d1
move.l d1,-(sp)
or.w #CACRF_EnableI!CACRF_ClearI!CACRF_ClearD!CACRF_WriteAllocate,d1
movec d1,cacr
movec cacr,d1
btst #CACRB_EnableI,d1
bne.b .not68040
or.b #AFF_68040!AFF_68030,d0
.not68040 move.l (sp)+,d1
or.w #CACRF_ClearI!CACRF_ClearD!CACRF_WriteAllocate,d1
movec d1,cacr
.not68020
btst #AFB_68881,d2
beq.b .no882
moveq #0,d1
dc.w $F201,$9000
dc.w $F201,$B000
dc.w $F327
dc.w $0C2F,$0018,$0001 cmp.b #$18,(1,sp)
beq.b .flushstack
bset #AFB_68882,d0
.flushstack dc.w $F35F
.no882 nop sync pipelines
rte
IFGT 0
>> Information taken from '68060 Upgrade Software Guide' <<
2) Inststructions supported by the 68040 but not by the 68060 directly that
can hurt performance:
o divx.l (64bit divide)
o mulx.l (64bit multiply)
o fdbcc
o fscc
o movep
o There are other instructions that are not supported or have to
be emulated but these aren't relevant for user applications.
ENDC
Test060 move.l a5,-(sp)
lea (.test060,pc),a5
call Disable No others playing around, please.
call Supervisor Ramsey revision:
call Enable
move.l (sp)+,a5
rts
.test060 movec vbr,a0 Hijack illegal instr. trap
move.l ($10,a0),-(sp)
move.l ($2C,a0),-(sp)
move.l a0,-(sp)
lea (.illegal,pc),a1
move.l a1,($10,a0)
move.l a1,($2C,a0)
bsr _flush040
moveq #0,d0
dc.w $4E7A,$0008 movec BUSCR,d0
dc.w $4E7A,$0808 movec PCR,d0
nop
nop
moveq #1,d0
.exit_illegal
move.l (sp)+,a0 Restore illegal instr. trap
move.l (sp)+,($2C,a0)
move.l (sp)+,($10,a0)
move.l d0,-(sp)
bsr _flush040
move.l (sp)+,d0
beq.b .no060
or.w #AFF_68060,d2
.no060 nop
rte
CNOP 0,4
.illegal lea (.exit_illegal,pc),a0
move.l a0,(2,sp)
nop sync pipelines
rte
CacheClearU moveq #0,d1
CacheControl movem.l d1-d2/a0/a1/a5/a6,-(sp)
move.l (4).w,a6 Use (4).w!!!
or.w #CACRF_ClearI!CACRF_ClearD!CACRF_WriteAllocate,d0
or.w #CACRF_ClearI!CACRF_ClearD!CACRF_WriteAllocate,d1
cmp.w #37,(LIB_VERSION,a6)
blo.b .oldkick
call CacheControl
bra.b .xit
.oldkick btst #AFB_68020,_AttnFlags+1
beq.b .xit
lea (.sv,pc),a5
call Supervisor
.xit movem.l (sp)+,d1-d2/a0/a1/a5/a6
rts
.sv movec cacr,d2
move.l d2,-(sp)
and.l d1,d0
not.l d1
and.l d1,d2
or.l d2,d0
movec d0,cacr
move.l (sp)+,d0
nop sync pipelines
rte
; IN: (extended attnflags field, MMU routines available)
; OUT: d0=24 or 32
GetAddressBits movem.l d1-a6,-(sp)
moveq #32,d7
tst.l DraCoID DraCo has 32bit 68060!
bne.b .xit
lea (_getaddrbits,pc),a0
moveq #1,d0
bsr RunNoMMU
.xit move.l d7,d0
movem.l (sp)+,d1-a6
rts
_getvbr sub.l a0,a0
btst #AFB_68010,_AttnFlags+1
beq.b .novbr
movec vbr,a0
.novbr rts
_getaddrbits bsr.b _getvbr
move.l ($08,a0),-(sp) Save Access Fault vector
move.l a0,-(sp) Save VBR
lea (.busfailure,pc),a1 Set new Access Fault vector:
move.l a1,($08,a0)
lea AddrChipData,a0 16 byte chip buffer
move.l #$BADCAFFE,d1
move.l #$DEADBABE,d2
move.l #'lOVE',d3
move.l #'8biT',d4
move.w #256-1-1,d5
movem.l d1-d4,(a0)
move.l a0,a1
.loop add.l #$1000000,a1
moveq #4-1,d0
move.l a0,a2
move.l a1,a3
.compare cmpm.l (a2)+,(a3)+
dbne d0,.compare
tst.w d0
dbpl d5,.loop
tst.w d5
bpl.b .exit Is 32bit
exg d1,d4
exg d2,d3
movem.l d1-d4,(a0)
movem.l (a1),d5-d6/a4-a5
movem.l d1-d4,(a1)
moveq #4-1,d0
move.l a0,a2
move.l a1,a3
.compare2 cmpm.l (a2)+,(a3)+
dbne d0,.compare2
movem.l d5-d6/a4-a5,(a1)
tst.w d0
bmi.b .exit Isn't 24bit
moveq #24,d7
.exit
.busfproceed move.l (sp)+,a0 Restore VBR
move.l (sp)+,($08,a0) Restore Access Fault vector
.xit move.l d7,d0
rts
CNOP 0,4
.busfailure bclr #0,(10,sp)
beq.b .bf_exit
moveq #32,d7 If CPU can generate bus failure then it's 32bit
lea (.busfproceed,pc),a0
move.l a0,(2,sp)
.bf_exit nop sync pipelines
rte
CNOP 0,4
GetVbr move.l a5,-(sp)
sub.l a0,a0
btst #AFB_68010,_AttnFlags+1
beq.b .novbr
lea (.getvbr,pc),a5
call Supervisor
.novbr move.l (sp)+,a5
rts
.getvbr movec vbr,a0
nop sync pipelines
rte
CNOP 0,4
ChipTiming2 bsr Disable
IFGT 0
tst.l NoHW
bne.b .nohw1
move.w (dmaconr,a4),d0
and.w #$000F,d0 only audio dma please...
or.w #$8000,d0 set
move.w #$000F,(dmacon,a4) Disable audio dma
move.l d0,-(sp)
.nohw1
ENDC
move.l #CACRF_EnableI,d0 Disable all but inst cache for test
move.l #~CACRF_WriteAllocate,d1 WAS: -1
bsr CacheControl
move.l d0,-(sp) Save prev cache state
jsr turnon060caches
move.l TimerBit,d0
lsl.l #8,d0
lea CIAB+ciacra,a2
add.w d0,a2
add.w d0,d0
lea CIAB+ciatalo,a3
add.w d0,a3
move.l CiabResource,a6
move.l TimerMask,d0 Clear timer interrupts
call SetICR
moveq #$7F,d0 Disable all timer interrupts
call AbleICR
move.l d0,-(sp)
clr.b (a2) Stop timer, set continuos mode, count 02 pulses
st (a3) Set timeout
st ($100,a3)
move.l TimerMask,d0
or.w #1<<7,d0 Enable timer interrupt
call AbleICR
move.l (ExecBase02,pc),a6
bsr ChipTiming
move.l d0,d7
move.l CiabResource,a6
moveq #$7F,d0 Disable all timer interrupts
call AbleICR
move.l (sp)+,d0 Restore old timer interrupts
or.w #1<<7,d0
call AbleICR
jsr restore060caches
move.l (ExecBase02,pc),a6 Restore cache state
move.l (sp)+,d0
moveq #-1,d1
bsr CacheControl
IFGT 0
tst.l NoHW
bne.b .nohw2
move.l (sp)+,d0
move.w d0,(dmacon,a4) Enable audio dma
.nohw2
ENDC
bsr Enable
move.l d7,d0
rts
Disable tst.l NoHW
bne.b .nohw
jmp (_LVODisable,a6)
.nohw jmp (_LVOForbid,a6)
Enable tst.l NoHW
bne.b .nohw
jmp (_LVOEnable,a6)
.nohw jmp (_LVOPermit,a6)
CNOP 0,4
ChipTiming tst.l NoHW
bne.b .nohw1
move.w (intenar,a4),d7
move.w #$7FFF,(intena,a4) Disable all interrupts
or.w #$8000,d7 set
move.w #$E000,(intena,a4) Enable level6 ints
bsr GetVbr Set new level 6 int
lea ($60+6*4,a0),a0
move.l (a0),-(sp)
move.l a0,-(sp) Can be done 'cause we're in a disabled state!!
lea (Level6Trap,pc),a1 Otherwise should get vbr again on restore.
move.l a1,(a0)
.nohw1
move.l a5,a0
moveq #0,d0 No disable!
bsr RunNoMMU
tst.l NoHW
bne.b .nohw2
move.l (sp)+,a0 Restore old level 6 int
move.l (sp)+,(a0)
move.w #$7FFF,(intena,a4) Disable all ints
move.w d7,(intena,a4) Enable interrupts
.nohw2
lea CiaIntData,a0
move.l (a0),d0
clr.l (a0)
not.l d0
rts
CNOP 0,8
Level6Trap movem.l d0-d1/a0-a1,-(sp)
move.b CIAB+ciaicr,d0
move.b TimerBit+3,d1
btst d1,d0
beq.b .xit_argh
lea CiaIntData,a1
bsr.b CiaIntCode
.xit_argh move.w #INTF_EXTER,$DFF000+intreq
movem.l (sp)+,d0-d1/a0-a1
nop sync pipelines
rte
CNOP 0,8
CiaIntCode subq.l #1,(a1) more loops to do?
bne.b .skip
move.l d4,(a1) store result
moveq #1,d4 exit loop
.skip rts
; Loop to time CPU:
CNOP 0,8
CPU_chiptiming addq.l #5,CiaIntData Number of loops
moveq #-1,d4 Init counter
move.b #%00010101,(a2) Start timer
bra.b .loop
CNOP 0,8
.loop subq.l #1,d4 Main timing loop
bne.b .loop
clr.b (a2) Stop timer
rts
CPUTIMER_SIZEOF EQU (*-CPU_chiptiming+7)&-8
; Loop to time FPU:
CNOP 0,8
FPU_chiptiming addq.l #3,CiaIntData Number of loops
moveq #-1,d4 Init counter
fmove.x #0.000000001,fp0
fmove.x fp0,fp1
move.b #%00010101,(a2) Start timer
bra.b .loop
CNOP 0,8
.loop fadd.x fp1,fp0 Main timing loop
fsub.x fp1,fp0
subq.l #1,d4
bne.b .loop
clr.b (a2) Stop timer
rts
CNOP 0,4
getromver_novmem
lea (.novirtmempart,pc),a0
moveq #1,d0
bra RunNoMMU
;; bsr RunNoMMU
;; rts
.novirtmempart
lea $1000000,a0
tst.l Phase5ID
beq.b .nophaserom
lea $0B80000,a1
moveq #8,d0
swap d0
cmp.l (-$14,a1),d0
bne.b .nophaserom
neg.l d0
move.l (a1,d0.l),d0
and.l #$FFF8FFFF,d0
cmp.l #$11104EF9,d0
bne.b .nophaserom
move.l a1,a0
.nophaserom
move.l (-$14,a0),d0
move.l d0,d1
and.l #$0003FFFF,d1
bne.b .no_rom
cmp.l #$00100000,d0
bhi.b .no_rom
sub.l d0,a0
move.l (a0),d1
and.l #$FFF8FFFF,d1
cmp.l #$11104EF9,d1
bne.b .no_rom
move.l (12,a0),d7
bsr.b ROMReSum
move.l d0,d6
.exit rts
.no_rom moveq #0,d7
moveq #0,d6
bra.b .exit
; IN: d0=rom size, a0=rom start
; OUT: d0=chksum
ROMReSum move.l d0,d1
lsr.l #3,d1
move.l -$18(a0,d0.l),d0
not.l d0
.loop add.l (a0)+,d0
bcc.b .skip1
addq.l #1,d0
.skip1 add.l (a0)+,d0
bcc.b .skip2
addq.l #1,d0
.skip2 subq.l #1,d1
bne.b .loop
not.l d0
rts
CNOP 0,4
; a0=code to run without MMU, d0=disable flag
; Code should be in Chip memory (in case of VMM or similar)
RunNoMMU movem.l d0/a5/a6,-(sp)
move.l (ExecBase02,pc),a6 Use (4).w??
lea (.super,pc),a5
DBG 'RNM1'
tst.l d0
beq.b .nodis
call Disable
.nodis tst.l NoHW
bne.b .nohw1
subq.l #4,sp
move.w $DFF000+dmaconr,(sp)
move.w #$000F,$DFF000+dmacon
or.w #$8000,(sp)
.nohw1 call Supervisor
tst.l NoHW
bne.b .nohw2
move.w (sp),$DFF000+dmacon
addq.l #4,sp
.nohw2 tst.l (sp)+
beq.b .noen
call Enable
.noen movem.l (sp)+,a5/a6
DBG 'RNM2'
tst.l d0
rts
CNOP 0,4
.super
;; or.w #$700,sr
tst.l _MMUID
beq.b .nommua
btst #AFB_68040,_AttnFlags+1
beq .is030a
bsr _flush040
move.l d0,-(sp)
movec TC,d0
move.l d0,-(sp)
movec URP,d0
move.l d0,-(sp)
movec SRP,d0
move.l d0,-(sp)
movec DTT1,d0
move.l d0,-(sp)
movec DTT0,d0
move.l d0,-(sp)
movec ITT1,d0
move.l d0,-(sp)
movec ITT0,d0
move.l d0,-(sp)
move.l #$00FFC000,d0
movec d0,ITT0
movec d0,ITT1
movec d0,DTT1
move.l #$0000C040,d0
movec d0,DTT0
move.l #$00030000,d0
movec d0,URP
movec d0,SRP
moveq #0,d0
movec d0,TC
bsr _flush040
move.l (7*4,sp),d0
.nommua jsr (a0)
tst.l _MMUID
beq.b .nommub
btst #AFB_68040,_AttnFlags+1
beq.b .is030b
bsr _flush040
move.l d0,-(sp)
move.l (1*4,sp),d0
movec d0,ITT0
move.l (2*4,sp),d0
movec d0,ITT1
move.l (3*4,sp),d0
movec d0,DTT0
move.l (4*4,sp),d0
movec d0,DTT1
move.l (5*4,sp),d0
movec d0,SRP
move.l (6*4,sp),d0
movec d0,URP
bsr _flush040
move.l (7*4,sp),d0
movec d0,TC
move.l (sp)+,d0
lea (7*4,sp),sp
.nommub2 addq.l #4,sp
.nommub nop sync pipelines
rte
.is030a clr.l -(sp)
pmove.l tc,(sp)
move.l (sp),-(sp)
bclr #7,(sp)
pmove.l (sp),tc
addq.l #4,sp
bra.b .nommua
.is030b pmove.l (sp),tc
bra.b .nommub2
_flush040 dc.w $F518 ; PFLUSHA flush the address translation cache
dc.w $F4F8 ; CPUSHA BC flush the caches into memory
dc.w $F4D8 ; INVA BC invalidate the data and inst caches
rts
CNOP 0,4
; OUT: d0=0 no mmu, d0=1 68851 mmu, d0=2 68030 MMU, d0=3 68040 MMU, d0=4 68060 MMU
; d1=mmu activity status, valid if d0>0
GetMMU
; Must be called from user state!!
; OUT: d0=success if working MMU exists, null otherwise
; d0=0 for no MMU
; 4 for 68060 or 68LC060 internal MMU
; 3 for 68040 or 68LC040 internal MMU
; 2 for 68030 internal MMU
; 1 for 68020 + 68851 MMU
; d1=mmu activity status, valid if d0>0
TestForMMU movem.l d2-a6,-(sp)
moveq #0,d7
move.l (ExecBase02,pc),a6
move.w _AttnFlags,d0
btst #AFB_68020,d0 No MMU below 68020!
beq.b .exit
cmp.w #37,(LIB_VERSION,a6)
blo.b .oldtest
lea (.test040plus,pc),a5
moveq #MC68060m,d6
tst.b d0 Test #AFB_68060
bmi.b .test
subq.l #1,d6
btst #AFB_68040,d0
bne.b .test
.otcont lea (.test020plus,pc),a5
subq.l #1,d6
btst #AFB_68030,d0
bne.b .test
subq.l #1,d6
.test
DBG 'MMU1'
jsr (a5)
DBG 'MMU2'
.exit move.l d7,d0
beq.b .fail
move.l d6,d0
.fail movem.l (sp)+,d2-a6
rts
.oldtest moveq #MC68030m+1,d6
bra.b .otcont
.test040plus lea (.gogo040,pc),a5
call Disable
call Supervisor
jmp (_LVOEnable,a6)
.gogo040 or.w #$700,sr Disable interrupts.
movec vbr,a0 Get VBR
move.l ($10,a0),-(sp) Save Illegal Instruction vector
move.l ($2C,a0),-(sp) Save F-Line Emul vector
move.l a0,-(sp) Save VBR
lea (.illegal040,pc),a1
move.l a1,($10,a0)
move.l a1,($2C,a0)
bsr _flush040
moveq #0,d0 IMPORTANT!
moveq #-1,d7
movec tc,d0 $4e7a0003 Test some "common" MMU regs:
movec urp,d1 $4e7a1806 Test 040/060 MMU only reg!!
movec srp,d1 $4e7a1807
.exit040 nop
nop
; d0=mmu TC (or null)
moveq #0,d1
tst.l d7
beq.b .gm4_nommu
btst #15,d0 Bit 15: On/Off!!
beq.b .gm4_nommu
moveq #1,d1
.gm4_nommu
move.l (sp)+,a0
move.l (sp)+,($2C,a0) Restore F-Line Emul vector
move.l (sp)+,($10,a0) Restore Illegal Instruction vector
bsr _flush040
nop sync pipelines
rte
CNOP 0,4
.illegal040 moveq #0,d7
lea (.exit040,pc),a0
move.l a0,(2,sp)
bsr _flush040
nop sync pipelines
rte
.simpletest call Disable
lea (.gogos020,pc),a5
call Supervisor
jmp (_LVOEnable,a6)
.gogos020 or.w #$700,sr Disable interrupts.
movec vbr,a0 Get VBR
move.l ($10,a0),-(sp) Save Illegal Instruction vector
move.l ($2C,a0),-(sp) Save F-Line Emul vector
move.l a0,-(sp) Save VBR
lea (.mmuinstfailures,pc),a1
move.l a1,($10,a0)
move.l a1,($2C,a0)
bsr _flush020
moveq #-1,d7
clr.l -(sp)
pmove.l tc,(sp)
.exitsupers move.l (sp)+,d5
moveq #0,d1
tst.l d7
beq.b .gm2_nommus
tst.l d5 Bit 31: On/Off!!
bpl.b .gm2_nommus
moveq #1,d1
.gm2_nommus
move.l (sp)+,a0 Restore VBR
move.l (sp)+,($2C,a0) Restore F-Line Emul vector
move.l (sp)+,($10,a0) Restore Illegal Instruction vector
bsr _flush020
rte
.mmuinstfailures
lea (.exitsupers,pc),a0 Invalid mmu instruction!
moveq #0,d7
move.l a0,(2,sp)
rte
.test020plus
;;GVP's move.l #$07E1<<16!$FFFF,d0 Try to find any 'Great Valley Products' board
;;works jsr FindConfigDev
;;now?? bne.b .simpletest If found test MMU with simple code (following one crashes!)
lea $D0000000,a2
move.w #$10000000/(512*1024)-1-1,d2
.tloop move.l a2,a1
call TypeOfMem
tst.l d0
bne .simpletest
add.l #512*1024,a2
dbf d2,.tloop
move.l #((1<<8)+.TTable1End-.TTable1),d0
moveq #MEMF_PUBLIC,d1
call AllocMem
tst.l d0
beq .simpletest
move.l d0,a4
add.l #(1<<7)-1,d0
and.w #-(1<<7),d0
move.l d0,a2
lea (.TTable1,pc),a0
move.l a2,a1
moveq #(.TTable1End-.TTable1),d0
call CopyMem Used to use CopyMemQuick... Is it KS1.3+?
call Disable
lea (.gogo020,pc),a5
call Supervisor
call Enable
movem.l d0-d1,-(sp)
move.l #((1<<8)+.TTable1End-.TTable1),d0
move.l a4,a1
call FreeMem
movem.l (sp)+,d0-d1
rts
.gogo020 or.w #$700,sr Disable interrupts.
moveq #0,d5 IMPORTANT!
move.l #$D0000000,d0 Test for our usage of area $D0000000:
move.l #$F0000000,d1
move.l sp,d2 SSP uses $D0000000?
and.l d1,d2
cmp.l d0,d2
beq .exitall
move.l #.test020plus,d2 PC?
and.l d1,d2
cmp.l d0,d2
beq .exitall
movec vbr,a0 Get VBR
move.l ($08,a0),-(sp) Save Access Fault vector
move.l ($10,a0),-(sp) Save Illegal Instruction vector
move.l ($2C,a0),-(sp) Save F-Line Emul vector
move.l ($E0,a0),-(sp) Save MMU Config Error vector
move.l ($E4,a0),-(sp) Save MMU Illegal Operation Error vector
move.l ($E8,a0),-(sp) Save MMU Access Level Violation Error vector
move.l a0,-(sp) Save VBR
subq.l #8,sp
lea (.mmufailure_es,pc),a1 Set new vectors:
move.l a1,($08,a0)
move.l a1,($10,a0)
move.l a1,($2C,a0)
move.l a1,($E0,a0)
move.l a1,($E4,a0)
move.l a1,($E8,a0)
bsr _flush020
pmove.l tc,(sp) Save tc:
moveq #-1,d7
move.l (sp),d5
bmi .exitsuper MMU in use!
moveq #0,d7
dc.w $F017,$4E00 pmove.q crp,(sp)
move.l (sp),d3 Save crp:
move.l (4,sp),d4
lea (.mmufailure,pc),a1
move.l a1,($08,a0)
move.l a1,($10,a0)
move.l a1,($2C,a0)
move.l a1,($E0,a0)
move.l a1,($E4,a0)
move.l a1,($E8,a0)
bsr _flush020
clr.l (sp) Clear translation control register
pmove.l (sp),tc
nop
move.l #$80000002,(sp) Set our crp: (was: 202)
move.l a2,(4,sp)
dc.w $F017,$4C00 pmove.q (sp),crp
move.l #$80D04780,(sp) Enable mmu mapping:
pmove.l (sp),tc
bsr _flush020
clr.b (.TTableD-.TTable1,a2) Make it map to address 0.
bsr _flush020
lea (.chipaddr,pc),a3 Test memory mapping a bit... :)
move.l a3,d0 (This should _finally_ catch
or.l #$D0000000,d0 nonfunctional 030 MMU)
move.l d0,a1
move.l #'MMUt',d0
move.l d0,(a3)
nop
cmp.l (a1),d0
bne.b .remove
not.l d0 Test write mapping:
move.l (a1),-(sp)
move.l d0,(a1)
nop
move.l (a3),d1
move.l (sp)+,(a1)
cmp.l d1,d0
bne.b .remove
clr.l (a3)
nop
tst.l (a1)
bne.b .remove
;move.l sp,$200.w debug
move.l #$D0000060,(.TTableD-.TTable1,a2) Make it invalid
bsr _flush020
nop Sync pipelines
move.l a0,a1
lea $DFFFFFFC,a0 Test memory (in)validity:
dc.w $F010,$9C15 ptestw #5,(a0),#7
dc.w $F017,$6200 pmove.w mmusr,(sp)
move.w (sp),d0
btst #10,d0
beq.b .remove Memory isn't invalid!!
lea (.busfailure,pc),a2
move.l a2,($08,a1)
bsr _flush020
move.l (a0),d0 Cause bus failure.
.busfproceed
.remove
.restoremmu clr.l (sp) Disable mapping:
pmove.l (sp),tc
nop
move.l d3,(sp) Restore crp:
move.l d4,(4,sp)
dc.w $F017,$4C00 pmove.q (sp),crp
move.l d5,(sp) Restore tc:
pmove.l (sp),tc
;move.l #'rest',($200).w debug
;move.l d5,($204).w
.exitsuper addq.l #8,sp
moveq #0,d1
tst.l d7
beq.b .gm2_nommu
tst.l d5 Bit 31: On/Off!!
bpl.b .gm2_nommu
moveq #1,d1
.gm2_nommu
move.l (sp)+,a0 Restore VBR
move.l (sp)+,($E8,a0) Restore MMU Access Level Violation Error vector
move.l (sp)+,($E4,a0) Restore MMU Illegal Operation vector
move.l (sp)+,($E0,a0) Restore MMU Config Error vector
move.l (sp)+,($2C,a0) Restore F-Line Emul vector
move.l (sp)+,($10,a0) Restore Illegal Instruction vector
move.l (sp)+,($08,a0) Restore Access Fault vector
.exitall bsr _flush020
rte
.mmufailure lea (.restoremmu,pc),a0 Invalid mmu table!?
.exitrt moveq #0,d7
.exitrt2 move.l a0,(2,sp)
.be_exitrte rte
.mmufailure_es lea (.exitsuper,pc),a0 Invalid mmu instruction!
bra.b .exitrt
.busfailure bclr #0,(10,sp)
beq.b .be_exitrte
moveq #-1,d7
lea (.busfproceed,pc),a0
bra.b .exitrt2
; Pagesize is 8K (=1<<%1101)
; Initial shift is 0 (%0000)
; TIA is 4 (%0100) [$10000000<<4=$100000000]
; TIB is 7 (%0111) [$00200000<<7=$10000000]
; TIC is 8 (%1000) [$00002000<<8=$00200000]
; TID is 0 (%0000)
; TC = $80D04780
; CRP = $80000002 TranslationTable
CNOP 0,4
.TTable1 dc.l $00000061,$10000061,$20000061,$30000061
dc.l $40000061,$50000061,$60000061,$70000061
dc.l $80000061,$90000061,$A0000061,$B0000061
dc.l $C0000061
.TTableD dc.l $D0000061
dc.l $E0000061,$F0000061
.TTable1End
.chipaddr dc.l 0
_flush020 move.l d0,-(sp)
movec cacr,d0
or.w #CACRF_ClearI!CACRF_ClearD,d0
movec d0,cacr
move.l (sp)+,d0
rts
CNOP 0,4
;; SECTION BSS_C,BSS_C Our megademo uses great chip-buffers :-)
;;ExecBase03 ds.l 1
NoHW ds.l 1
_MMUID ds.l 1
TimerBit ds.l 1
TimerMask ds.l 1
CiabResource ds.l 1
CiaIntData ds.l 1
_GfxBase ds.l 1
ds.l 0 Align
_AttnFlags ds.w 1
AddrChipData ds.l 4 16 bytes
END